c#反射-查找集合的泛型类型
我反映了一个属性“废话”,它的类型是ICollectionc#反射-查找集合的泛型类型,c#,reflection,properties,types,C#,Reflection,Properties,Types,我反映了一个属性“废话”,它的类型是ICollection public ICollection<string> Blah { get; set; } private void button1_Click(object sender, RoutedEventArgs e) { var pi = GetType().GetProperty("Blah"); MessageBox.Show(pi.PropertyType.ToSt
public ICollection<string> Blah { get; set; }
private void button1_Click(object sender, RoutedEventArgs e)
{
var pi = GetType().GetProperty("Blah");
MessageBox.Show(pi.PropertyType.ToString());
}
public ICollection Blah{get;set;}
私有无效按钮1\u单击(对象发送者,路由目标)
{
var pi=GetType().GetProperty(“Blah”);
Show(pi.PropertyType.ToString());
}
这给了我(正如你所期望的!)i收集
但我真的想得到收集类型,即ICollection
(而不是ICollection
)-有人知道我该怎么做吗
您将需要查看以下示例:
List<String> strings=new List<string>();
Console.WriteLine(strings.GetType().GetGenericTypeDefinition());
foreach (var t in strings.GetType().GetGenericArguments())
{
Console.WriteLine(t);
}
List strings=newlist();
Console.WriteLine(strings.GetType().GetGenericTypeDefinition());
foreach(字符串中的var t.GetType().GetGenericArguments())
{
控制台写入线(t);
}
这将输出:
System.Collections.Generic.List`1[T]系统字符串
我有一个相似但更复杂的问题。。。我想确定类型是可动态分配给集合类型成员还是数组类型成员 因此,如果要添加的对象的类型可分配给集合或数组类型的成员,那么下面是通过验证动态获取集合或数组成员类型的更好方法:
List<IComparable> main = new List<IComparable>() { "str", "řetězec" };
IComparable[] main0 = new IComparable[] { "str", "řetězec" };
IEnumerable collection = (IEnumerable)main;
//IEnumerable collection = (IEnumerable)main0;
string str = (string) main[0];
if (collection.GetType().IsArray)
{
if (collection.GetType().GetElementType().IsAssignableFrom(str.GetType()))
{
MessageBox.Show("Type \"" + str.GetType() + "\" is ok!");
}
else
{
MessageBox.Show("Bad Collection Member Type");
}
}
else
{
if (collection.GetType().GenericTypeArguments[0].IsAssignableFrom(str.GetType()))
{
MessageBox.Show("Type \"" + str.GetType() + "\" is ok!");
}
else
{
MessageBox.Show("Bad Collection Member Type");
}
}
List main=newlist(){“str”,“řetězec”};
IComparable[]main0=新的IComparable[]{“str”,“řetězec”};
IEnumerable集合=(IEnumerable)main;
//IEnumerable集合=(IEnumerable)main0;
string str=(string)main[0];
if(collection.GetType().IsArray)
{
if(collection.GetType().GetElementType().IsAssignableFrom(str.GetType()))
{
Show(“Type\”+str.GetType()+“\”是可以的!”;
}
其他的
{
MessageBox.Show(“错误的集合成员类型”);
}
}
其他的
{
if(collection.GetType().GenericTypeArguments[0].IsAssignableFrom(str.GetType()))
{
Show(“Type\”+str.GetType()+“\”是可以的!”;
}
其他的
{
MessageBox.Show(“错误的集合成员类型”);
}
}
但其类型是ICollection
…同意,ICollection
和ICollection
是两种完全不同的类型。请注意,这将返回“ICollection`1[T]”,即CLR表示“ICollection”。我也会提出同样的建议,所以对于getgenericalarguments
来说+1.+1。这就是我在这里着陆时想要的。
List<IComparable> main = new List<IComparable>() { "str", "řetězec" };
IComparable[] main0 = new IComparable[] { "str", "řetězec" };
IEnumerable collection = (IEnumerable)main;
//IEnumerable collection = (IEnumerable)main0;
string str = (string) main[0];
if (collection.GetType().IsArray)
{
if (collection.GetType().GetElementType().IsAssignableFrom(str.GetType()))
{
MessageBox.Show("Type \"" + str.GetType() + "\" is ok!");
}
else
{
MessageBox.Show("Bad Collection Member Type");
}
}
else
{
if (collection.GetType().GenericTypeArguments[0].IsAssignableFrom(str.GetType()))
{
MessageBox.Show("Type \"" + str.GetType() + "\" is ok!");
}
else
{
MessageBox.Show("Bad Collection Member Type");
}
}