我正在尝试调用我创建的通用方法,称为LoadItems<T>()
. List<T>
此方法对从数据库返回的项目执行一系列操作。
我遇到的问题是调用该LoadItems<T>()
方法。我所要处理的只是一个对象。我想将此对象解析为 T 以便我可以调用我的方法。
以伪方式解释:
object theObject = GetTheObject();
LoadItems<GetGenericType(theObject)>();
有没有办法做到这一点?
万分感谢
您将不得不使用反射或更改您的设计。
如果要使用反射,过程比较复杂:
// 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<>
类型,那么您就不走运了。您在编译时不知道类型是什么。您可以将其转换为 non-generic IList
,或使用一些 LINQ 表达式将其转换为更有用的东西,如下所示:
var niceResults = results.Cast<SomeBaseType>().ToList();
与往常一样,如果您不确定发生了什么,请阅读我上面列出的函数的文档。
是的,使用反射:
MethodInfo mi = this.GetType().GetMethod("LoadItems").MakeGenericMethod(new Type[] { theObject.GetType() });
mi.Invoke(this, null);
要获取您通常使用的对象类型
typeof(GetTheObject)
或者
theObject.GetType()
但是你不应该像这样定义你的功能吗?
public void LoadItems<T>(T obj)
{
}
并这样称呼它?
LoadItems(theObject);