从调用的泛型方法动态设置类型或结果



如果问题有点不清楚,我很抱歉;我不完全确定该怎么说。

我的问题是这个。我有两个班,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); 

相关内容

  • 没有找到相关文章

最新更新