2014-11-23 4 views
1

Я играл с дженериками и пытаюсь выяснить, как (если возможно) я могу использовать один метод для нескольких классов, передавая объект динамически.Динамический переход типа объекта к общему методу

У меня есть несколько классов, Foo и Bar согласно ниже:

[Serializable()] 
public class Foo 
{ 
    private string m_Code; 
    private Bar m_Bar = new Bar(); 

    public string Code 
    { 
     get { return m_Code; } 
     set { m_Code = value; } 
    } 

    public Bar Bar 
    { 
     get { return m_Bar; } 
     set { m_Bar = value; } 
    } 
} 

и

[Serializable()] 
public class Bar 
{ 
    private string m_Name; 

    public string Name 
    { 
     get { return m_Name; } 
     set { m_Name = value; } 
    } 
} 

Если я заполнить мой класс с некоторыми фиктивными данными, как, например:

Foo.Code = "myFoo"; 
Foo.Bar.Name = "myBar"; 

У меня есть общий метод для возврата значения из класса:

public static object getItem<T>(T obj, string _Value) 
{ 
try 
{ 
    object _Resolved = null; 
    _Resolved = obj.GetType().GetProperty(_Value).GetValue(obj, null); 
    return _Resolved; 
} 
catch (Exception ex) 
{ 
    return null; 
} 
} 

Вызов моего метода getItem, как показано ниже, отлично работает.

string FooCode = Convert.ToString(getItem<Foo>(myFoo, "Code")) // returns "myFoo" 
string BarName = Convert.ToString(getItem<Bar>(myFoo.Bar, "Name")) // returns "myBar" 

Что мне любопытно, если есть общий способ адресации моего метода GetItem, определяя объект?

Например:

object myObject = Foo; 
string FooCode = Convert.ToString(getItem<typeof(myObject)>(myObject, "Code")) // And this would returns "myFoo" 

или:

object myObject = Bar; 
string BarName = Convert.ToString(getItem<typeof(myObject)>(myObject, "Name")) // And this would returns "myBar" 

ответ

0

В методе getItem, вы не используете параметр типа T. Для вашего конкретного вопроса (где тип obj не известен во время компиляции), вы могли бы просто определить свой метод следующим образом -

public static object getItem(object obj, string _Value) 
2

Вы можете сделать так.

string FooCode = Convert.ToString(getItem(myFoo, "Code")) // returns "myFoo" 
string BarName = Convert.ToString(getItem(myFoo.Bar, "Name")) // returns "myBar" 

Он автоматически выводит тип объекта. Если вы хотите вызвать метод Generic во время выполнения из типа объекта, вам необходимо создать общий метод с использованием отражения. Ниже приведен пример.

public class Program 
{ 
static void Main(string[] args) 
     { 
      Foo myFoo = new Foo(); 
      myFoo.Bar = new Bar(); 
      myFoo.Bar.Name = "Jinal"; 
      myFoo.Code = "Ths is test"; 
      // By Using infer 
      string FooCode = Convert.ToString(getItem(myFoo, "Code")); // returns "myFoo" 
      string BarName = Convert.ToString(getItem(myFoo.Bar, "Name")); 

      // Using Reflection 
      Type ex = typeof(Program); 
      MethodInfo mi = ex.GetMethod("getItem"); 
      object foo = myFoo; 
      var methodgetItem = mi.MakeGenericMethod(foo.GetType()); 
      string result = Convert.ToString(methodgetItem.Invoke(null, new object[]{foo , "Code"})); 

      object bar = myFoo.Bar; 
      var methodgetItem1 = mi.MakeGenericMethod(bar.GetType()); 
      string result1 = Convert.ToString(methodgetItem1.Invoke(null, new object[] {bar , "Name" })); 

      Console.ReadLine(); 
     } 

     public static object getItem<T>(T obj, string _Value) 
     { 
      try 
      { 
       object _Resolved = null; 
       _Resolved = obj.GetType().GetProperty(_Value).GetValue(obj, null); 
       return _Resolved; 
      } 
      catch (Exception ex) 
      { 
       return null; 
      } 
     } 
} 
+0

вопрос имеет декларацию 'myFoo' и т.д., как' object', следовательно, тип вывода не поможет здесь .. Вопрос конкретно говорит о том случае будучи сценарии выполнения (так называемый динамическим, ОП) –

Смежные вопросы