0

我正在尝试调用我创建的通用方法,称为LoadItems<T>(). List<T>此方法对从数据库返回的项目执行一系列操作。

我遇到的问题是调用该LoadItems<T>()方法。我所要处理的只是一个对象。我想将此对象解析为 T 以便我可以调用我的方法。

以伪方式解释:

object theObject = GetTheObject();
LoadItems<GetGenericType(theObject)>();

有没有办法做到这一点?

万分感谢

4

3 回答 3

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<>类型,那么您就不走运了。您在编译时不知道类型是什么。您可以将其转换为 non-generic IList,或使用一些 LINQ 表达式将其转换为更有用的东西,如下所示:

var niceResults = results.Cast<SomeBaseType>().ToList();

与往常一样,如果您不确定发生了什么,请阅读我上面列出的函数的文档。

于 2013-02-07T04:58:30.513 回答
2

是的,使用反射:

MethodInfo mi = this.GetType().GetMethod("LoadItems").MakeGenericMethod(new Type[] { theObject.GetType() });

mi.Invoke(this, null);
于 2013-02-07T04:56:17.307 回答
-1

要获取您通常使用的对象类型

typeof(GetTheObject) 

或者

theObject.GetType()

但是你不应该像这样定义你的功能吗?

    public void LoadItems<T>(T obj)
    {

    }

并这样称呼它?

LoadItems(theObject);
于 2013-02-07T04:55:47.320 回答