c # Преобразовать универсальный объект в его реальный объект - PullRequest
0 голосов
/ 07 июня 2018

Я написал скрипт задачи в пакете служб SSIS.У меня есть переменная типа объекта VAR_A, и я назначил объект ClassA этой переменной VAR_A.

Например: -

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

Теперь у меня есть другой скрипт задачи, в котором я получаю переменную VAR_Aкак объект класса OBJECT, но теперь я хотел преобразовать этот объект в объект ClassA динамически или с помощью рефлексии.Потому что может быть несколько объектов, и я хотел напечатать все значения объектов, используя 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 голосов
/ 07 июня 2018

Предполагая, что вы знаете все возможные типы классов, которые вы собираетесь получить, вы можете сделать что-то вроде этого:

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

Если все, что вам нужно, это имя класса, то obj.GetType ().Name должен сделать это.

0 голосов
/ 07 июня 2018

Я не уверен, правильно ли я понял ваш вопрос.Правильно ли это: вы используете несколько классов, которые все реализуют метод 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» во втором вызове.Если я не понял вас правильно, это запрошенное поведение.

...