AMess.Foo = MessyData.GetData<MessyData.GetType(key)>(key);
我的问题与我的例子类似。我有一个动态类型的数据源,所以我必须做一些事情来确定数据类型。但是在任何地方进行类型检查都是痛苦的屁股。所以我想也许我可以有一些代码只是为了告诉我它是什么类型。我可以这样做吗?
或者更好的解决方案?
请不要担心AMess.Foo
,它会吃掉所有东西。
答案 0 :(得分:2)
不,它不能。您将不得不使用Reflection。我目前还没有在我的机器上安装Visual Studio,因此我目前无法测试语法,但这应该是关闭的:
var type = MessyData.GetType(key);
var castMethod = MessyData.GetType().GetMethod("GetData").MakeGenericMethod(type);
AMess.Foo = castMethod.Invoke(MessyData, new[] { key });
答案 1 :(得分:1)
没有。必须在编译时解析泛型类型参数。
如果您使用:
MessyData.GetData<SomeType>(key);
然后SomeType
需要是特定类(或接口,结构等)的名称。它在问题中永远不会是表达式。
如果你推断出类型,如:
MessyData.GetData(key); // infer type arg
然后调用中使用的类型是key
变量的编译时类型,不是运行时类型。这些类型可能有所不同。
如果您真的想要动态输入,可以让GetData
接受dynamic
类型的参数(该方法将是非泛型的)。但是你要解决的问题是什么?