我正在尝试调用我创建的名为LoadItems<T>()
的泛型方法。此方法对从数据库返回的List<T>
项执行大量操作。
我遇到的问题是调用LoadItems<T>()
方法。我必须要做的就是一个对象。我想将此对象解析为T,以便我可以调用我的方法。
以伪方式解释:
object theObject = GetTheObject();
LoadItems<GetGenericType(theObject)>();
有没有办法做到这一点?
非常感谢
答案 0 :(得分:5)
您必须使用反射或更改设计。
如果您想使用反射,过程很复杂:
// get the type of the object variable
var objType = theObject.GetType();
// I'm assuming that LoadItems() is a method in the current class
var selfType = GetType();
// you might need to use an overload of GetMethod() -- please read the documentation!
var methodInfo = selfType.GetMethod("LoadItems");
// this fills in the generic arguments
var genericMethodInfo = methodInfo.MakeGenericMethod(new[] { objType });
// this calls LoadItems<T>() with T filled in; I'm assuming it's a method on this class
var results = genericMethodInfo.Invoke(this, null);
请注意,results
将是object
。如果您希望它是特定的List<>
类型,那么您就不走运了。您不知道编译时类型是什么。您可以将它强制转换为非泛型IList
,或者使用一些LINQ表达式将其转换为更有用的东西,如下所示:
var niceResults = results.Cast<SomeBaseType>().ToList();
与往常一样,如果您不确定发生了什么,请阅读上面列出的功能的文档。
答案 1 :(得分:2)
是的,使用反射:
MethodInfo mi = this.GetType().GetMethod("LoadItems").MakeGenericMethod(new Type[] { theObject.GetType() });
mi.Invoke(this, null);
答案 2 :(得分:-1)
获取通常使用的对象类型
typeof(GetTheObject)
或
theObject.GetType()
但你不应该像这样定义你的功能吗?
public void LoadItems<T>(T obj)
{
}
并且这样称呼它?
LoadItems(theObject);