【发布时间】:2020-05-25 21:06:07
【问题描述】:
我有一个方法返回一个实现接口的对象列表:
private List<IFoo> GetData(string key)
{
...returns a different concrete implementation depending on the key
switch (key)
{
case "Bar":
return new List<Bar>();//Bar:IFoo
break;
case "Foo":
return new List<Foo>();//Foo:IFoo
break;
case "FooBar":
return new List<FooBar>();//FooBar:IFoo
break;
//etc etc - (quite a lot of these)
}
}
我想将结果转换为数据表:
var result = GetData("foobar");
return ConvertToDataTable(result)
我的 ConvertToDataTable 实现如下所示:
private DataTable ConvertToDataTable<T>(IEnumerable<T> data)
{
//problem is typeof(T) is always IFoo - not FooBar
PropertyInfo[] properties = typeof(T).GetProperties();
DataTable table = new DataTable();
foreach (var prop in properties)
{
table.Columns.Add(prop.DisplayName, prop.PropertyType);
}
//etc..
}
如何在泛型 ConvertToDataTable 方法中获取基础类型?
【问题讨论】:
-
在你的情况下返回 ConvertToDataTable
(result) 是不可能的吗? -
@Ostas 这意味着以某种方式根据密钥在 GetData 方法中重复 switch 语句。我可以在调试器中看到具体类型。所以如果我能以某种方式使用反射来实现它会很酷 - 而不是重组我的代码
-
我可能需要使用
GetData(string key, out Type type)和ConvertToDataTable (Type type),但这感觉不太对 -
我明白了,没有意识到您在 GetData 中有一个 switch 语句。 GetData 可以是私有 List
GetData(string key) where T: IFoo 并返回 (theTypeDeterminedAfterTheSwitch)result. -
@Ostas - 我认为这不起作用,因为调用代码必须指定类型参数 - 所以它实际上是同一个问题
标签: c# reflection types