c#将通用对象转换为其真实对象

时间:2018-06-07 17:55:00

标签: c# variables dynamic ssis casting

我在SSIS包中编写了一个任务脚本。我有一个对象类型变量VAR_A,我已经为该变量VAR_A分配了一个ClassA对象。

如: -

ClassA classA=new ClassA();
Dts.Variables["User::VAR_A"].Value = classA; //Assigned here

现在我有另一个任务脚本,我将VAR_A变量作为OBJECT类对象,但现在我想将此对象动态转换为ClassA对象或使用refection。因为可以有多个对象,我想使用ToString()打印所有对象值,我在所有类中都覆盖了它。

如下所示: -

Microsoft.SqlServer.Dts.Runtime.Application app = new Microsoft.SqlServer.Dts.Runtime.Application();

Package pkg = app.LoadPackage(@"C:\Users\Sample-SSIS-Package\\" + @"sample_Package.dtsx",  null);

Variables pkgVars = pkg.Variables;

foreach (Variable pkgVar in pkgVars)
{
  if (pkgVar.DataType == TypeCode.Object)
  {
    Object obj = pkgVar.Value;  

    //This below line should be dynamic, I cant use manual casting because this can be ClassA or ClassB or CLassC ..anything 

    ClassA ca=(ClassA)obj ; 
    MessageBox.Show(pkgVar.Name+ "-----"+ca.ToString());             

  }
}  

2 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了你的问题。 这是正确的:您使用几个都实现ToString()方法的类。在你的程序中,你不知道你的对象实际上是哪个类,但你想调用它的ToString()方法。

在这种情况下,您可以在程序中调用Object.ToString()方法。

示例:

class Class1
{
    public override string ToString()
    {
        return "Class1";
    }
}
 class Class2
    {
        public override string ToString()
        {
            return "Class2";
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            var cl1 = new Class1();
            var cl2 = new Class2();
            Test(cl1);
            Test(cl2);
        }

        static void Test(Object obj)
        {
            Console.WriteLine(obj.ToString());
            Console.Read();
        }
    }

obj.ToString()方法在第一次调用中返回“Class1”,在第二次调用中返回“Class2”。如果我不明白你这是请求的行为。

答案 1 :(得分:0)

假设你知道你将要获得的所有可能的类类型,那么你可以这样做:

     switch(obj.GetType().Name)
     {
         case "ClassA":
              ClassA ca = obj as ClassA;
              break;
         case "ClassB":
              ClassB cb = obj as ClassB;
              break;
     }

如果您想要的只是类的名称,那么obj.GetType()。Name应该这样做。