我有一个方法
String Foo<T> where T: WebControl
现在我有一个像“超链接”这样的字符串。我们想要的是根据从字符串到通用的映射来调用Foo<Hyperlink>
。
字典的外观如何?
不是:
private Dictionary<string, Type> _mapping = new Dictionary<string, Type>()
{
{"hyperlink", typeof(HyperLink)}
};
我希望像Foo<_mapping[mystring]>
那样访问它吗?如果是的话,字典必须如何?
修改:已接受的解决方案
String _typename = "hyperlink";
MethodInfo _mi = typeof(ParserBase).GetMethod("Foo");
Type _type = _mapping[_typename];
MethodInfo _mig = _mi.MakeGenericMethod(_type);
return (String)_mig.Invoke(this, new object[] { _props }); // where _props is a dictionary defined elsewhere
// note that the first parameter for invoke is "this", due to my method Foo is not static
答案 0 :(得分:1)
你想要的是不可能的,因为那将是运行时(例如,字典可以包含任何内容)。
如果你想通过运行时手动生成它,你可以这样做,但你不会得到C#对泛型的编译时检查。您可以通过MethodInfo.MakeGenericMethod。
进行此操作像这样:
var m = typeof(MyClass);
var mi = ex.GetMethod("Foo");
var mig = mi.MakeGenericMethod(_mapping["hyperlink"]);
//Invoke it
mig .Invoke(null, args);
答案 1 :(得分:1)
这种方式是不可能的。泛型仅支持compile-tipe绑定。
答案 2 :(得分:1)
不,你不能这样做。您的泛型类型想要在编译时创建自己,但它不知道它是什么类型直到运行时。但是,您可以使用反射。
Type untypedGeneric = typeof(Foo<>);
Type typedGeneric = untypedGeneric.MakeGenericType(_mapping[mystring]);