我在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());
}
}
答案 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应该这样做。