如果问题有些不清楚,我深表歉意;我不完全确定如何表达这一点。
我的问题是这个。我有两个班,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>
函数;我必须使用我在那里得到的东西。
提前感谢您提供的任何帮助。