有没有办法通过从对象中定义T来调用Method <t>()?</t>

时间:2013-02-07 04:53:09

标签: c# generics

我正在尝试调用我创建的名为LoadItems<T>()的泛型方法。此方法对从数据库返回的List<T>项执行大量操作。

我遇到的问题是调用LoadItems<T>()方法。我必须要做的就是一个对象。我想将此对象解析为T,以便我可以调用我的方法。

以伪方式解释:

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

有没有办法做到这一点?

非常感谢

3 个答案:

答案 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);