2

如果问题有些不清楚,我深表歉意;我不完全确定如何表达这一点。

我的问题是这个。我有两个班,Manager<T>Result<T>。在 内Manager<T>,我有一大堆检索功能。通常,我会这样调用Manager<T>并设置它的类型:

Manager<SpecialDataType> mgr = new Manager<SpecialDataType>;

之后,我设置了我的 Result 类型,并使用 Manager 中的函数填充它,其中 1 是显示的 GetItem 函数的参数。然后我可以访问我的项目中的内容:

Result<SpecialDataType> item = new Result<SpecialDataType>;
item = mgr.GetItem(1);
string x = item.Teaser;

好的。所以现在,我要做的是设置<SpecificDataType>在运行时填写。我想我已经有了一半的解决方案,使用泛型类型,如下所示:

Type generalType= Type.GetType("SpecificDataType");
Type managerType= typeof(Manager<>).MakeGenericType(generalType);
var managerInstance= Activator.CreateInstance(managerType);
object[] args = {1};
MethodInfo getItemMethod = managerInstance.GetMethod("GetItem");

但这就是我卡住的地方。我的 Result 类具有我需要能够访问的特定属性。它们是或者当然是由我要转换的数据类型设置的。当我做一个Invoke,像这样:

var item = getItemMethod.Invoke(managerInstance, args); 

我没有得到任何我知道属于item. 我想这是有道理的,因为我们不知道是什么item。所以,我们尝试了这个:

Type dataType = typeof(SmartFormData<>).MakeGenericType(sfType);
var item = Activator.CreateInstance(dataType);
item = getItemMethod.Invoke(managerInstance, args); 

并得到了同样的结果。我似乎无法到达item.Teaser

我不是原生的 ac# 编码器(好像这在我问的这个过于复杂的问题中并不明显),所以我对反射和泛型类型并不是非常熟悉。谁能指出我如何解决这个问题的正确方向,或者如何从不同的角度解决这个问题?唯一需要注意的是我不能修改Manager<T>andResult<T>函数;我必须使用我在那里得到的东西。

提前感谢您提供的任何帮助。

4

2 回答 2

0

您需要将调用结果转换为您期望的类型

var item = (Result<SpecificDataType>)getItemMethod.Invoke(managerInstance, args); 
于 2013-07-18T14:02:33.523 回答
0

正如 Dark Falcon 在他的评论中正确指出的那样,您将不得不使用反射来获取您的项目的成员。

或者,如果您在 .NET 4 或更高版本中,您可以使用dynamic关键字来大大简化事情:

Type generalType= Type.GetType("SpecificDataType");
Type managerType= typeof(Manager<>).MakeGenericType(generalType);
dynamic managerInstance = Activator.CreateInstance(managerType);
var item = managerInstance.GetItem(1);
string x = item.Teaser;
于 2013-07-18T14:04:52.083 回答