如果问题有点不清楚,我很抱歉;我不完全确定该怎么说。
我的问题是这个。我有两个班,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
。
我天生就不是一个c#程序员(从我问的这个过于复杂的问题中,这一点还不明显),所以我对反射和泛型类型并不是非常熟悉。有人能为我指出如何解决这个问题的正确方向吗?或者如何从不同的角度来处理这个问题?唯一需要注意的是,我不能修改Manager<T>
和Result<T>
函数;我必须使用那里给我的东西。
提前感谢您提供的任何帮助。
正如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;
您需要将调用结果强制转换为您期望的类型
var item = (Result<SpecificDataType>)getItemMethod.Invoke(managerInstance, args);