C# 通过反射和隐式转换创建通用列表
我的目标是.Net framework的4.0版。我编写了以下简单代码:C# 通过反射和隐式转换创建通用列表,c#,.net,C#,.net,我的目标是.Net framework的4.0版。我编写了以下简单代码: public class A { public A() { } } public class B { public B() { } public static implicit operator A(B b) { return new A(); } } 然后我创建了一个通用列表: var mylist = typeof(List
public class A
{
public A()
{
}
}
public class B
{
public B()
{
}
public static implicit operator A(B b)
{
return new A();
}
}
然后我创建了一个通用列表:
var mylist = typeof(List<>).MakeGenericType(typeof(A)).GetConstructor(Type.EmptyTypes).Invoke(new object[]{});
但是,如果我运行以下代码,将引发以下异常:
The value "B" is not of type "A" and cannot be used in this generic collection.
参数名称:value
((IList)mylist).Add(new B());
问题是,当您将列表强制转换为
IList
并调用Add
时,编译器(隐式地)将强制转换添加到B
实例中的a
。在第二种情况下,IList
只接受Add
方法中的对象B
是一个对象,因此它不会强制转换为A
。因此,当该方法试图在内部将其添加到基础数据结构时,会引发异常
您甚至可以通过以下代码对其进行测试:
var fails = (A) (object) new B();
既然您询问如何解决这个问题(尽管在本例中我不认为有必要将您的类型强制转换为IList
),您可以在添加时将B
显式强制转换为A
。例如:
mylist.Add((A) new B());
当您将类型为B
的对象添加到IList
时,隐式转换仅在第一个Add
中发生。在第二种情况下,您将其添加到非泛型的IList
,这是一个对象集合,当对象实际添加到列表时,不会发生隐式转换并爆炸
即使这样也不行:
var mylist = new List<A>();
((IList<A>)mylist).Add(new B());
((IList)mylist).Add(new B())
我怎样才能解决这个问题?谢谢。但我写这段代码是为了测试。在实际代码中,我通过反射获得所有类型,但我无法编写Add((A)new B());谢谢。但我写这段代码是为了测试。在实际代码中,我通过反射获得所有类型,但我无法编写Add((A)new B())@阿夫希纳利扎德我明白。
var mylist = new List<A>();
((IList<A>)mylist).Add(new B());
((IList)mylist).Add(new B())
((IList)mylist).Add((A)new B());