[英]Dynamically pass object type to generic method
我一直在研究泛型,并且试图弄清楚如何(如果可能)通过动态传递对象来跨多个类使用单个方法。
我有以下两节课,分别是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"
你可以这样
string FooCode = Convert.ToString(getItem(myFoo, "Code")) // returns "myFoo"
string BarName = Convert.ToString(getItem(myFoo.Bar, "Name")) // returns "myBar"
它会自动推断对象的类型。 如果要在运行时从对象类型调用通用方法,则必须使用反射创建通用方法。 以下是示例。
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;
}
}
}
在getItem
方法中,没有使用Type参数T
对于您的特定问题(在编译时不知道obj
类型),您可以按照以下方式简单地定义您的方法-
public static object getItem(object obj, string _Value)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.