到目前为止,我有这个:
if (o.GetType().IsGenericType && o is System.Collections.IEnumerable)
{
var typefield = typeof(List<object>).GetFields().Where(f => f.Name == "T").ToArray();
Type T = (Type)(typefield[0].GetValue(o));
addButton.Enabled = true;
if (((System.Collections.IList)o).Count > 0)
{
removeButton.Enabled = true;
}
comboBox1.Enabled = true;
comboBox1.Items.Clear();
foreach (var item in Assembly.GetAssembly(T).GetTypes().Where(x => T.IsAssignableFrom(x) && !x.IsAbstract))
{
comboBox1.Items.Add(item);
}
comboBox1.DisplayMember = "Name";
}
但它在线路上崩溃&#34;类型T =(类型)(typefield [0] .GetValue(o));&#34;因为数组是空的,这意味着前一行不起作用。
问题: 假设通过第一行的所有内容都是List,我该如何确定列表中的对象类型。 (请注意,检查成员的类型不够好。成员很可能是从列表定义中指定的类型派生的。)
P.S。 我在这里读到,我的第一行是确定列表的最佳方式: If object is Generic List 你有更准确的方法吗?
答案 0 :(得分:0)
如果我理解正确,你可以通过
获得通用参数Type.GetGenericArguments()
请参阅https://msdn.microsoft.com/en-us/library/system.type.getgenericarguments%28v=vs.110%29.aspx
答案 1 :(得分:0)
要确定List<T>
的类型,您可以使用Type.GetGenericArguments()
var o = new List<int>();
if (o.GetType().IsGenericType && o is IList)
{
var args = o.GetType().GetGenericArguments()
if(args.Count() == 1)
{
Type T = args[0];
// rest of code
}
}
答案 2 :(得分:0)
您可以使用GetGenericArguments
。此代码将为您提供列表o
if (o.GetType().IsGenericType && o is System.Collections.IEnumerable)
{
var itemType = o.GetType().GetGenericArguments()[0];
//Console.WriteLine(itemType);
}
如果你有
var o = new List<string>{ "a", "b" };
它会给你
System.String;
答案 3 :(得分:0)
我认为一个答案可能是这种方法:
public IEnumerable<Type> GetGenericIEnumerables(object o) {
return o.GetType()
.GetInterfaces()
.Where(t => t.IsGenericType == true
&& t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
.Select(t => t.GetGenericArguments()[0])
.ToList();
}
你可以这样使用它:
var type= GetGenericIEnumerables(o).FirstOrDefault();
如果o不是IEnumerable<T>
,则类型为null,否则返回T
。
如果o本身不是通用的,并且继承自IEnumerable<T>
,例如对于string
,该函数将返回char
。