C# 使用从反射获取类型强制转换泛型对象
我试图在一个通用对象中强制转换一个对象,在这里我需要动态地更改类型C# 使用从反射获取类型强制转换泛型对象,c#,.net,generics,reflection,xamarin,C#,.net,Generics,Reflection,Xamarin,我试图在一个通用对象中强制转换一个对象,在这里我需要动态地更改类型 Dog继承Animal,类“T”必须从EntityBase继承。例如,Chihuahua继承了EntityBase for (int i = 0; i < list.Count(); i++) { if (list?.ElementAt(i)?.GetType().GetTypeInfo().BaseType == typeof(Animal)) { var type = list.Elem
Dog
继承Animal
,类“T
”必须从EntityBase
继承。例如,Chihuahua
继承了EntityBase
for (int i = 0; i < list.Count(); i++) {
if (list?.ElementAt(i)?.GetType().GetTypeInfo().BaseType == typeof(Animal))
{
var type = list.ElementAt(i).GetType();
// is wrong, must use a class no a type
// var animal = list.ElementAt(i) as GenericObject<Dog<type>>
// Correct syntax but cast results null
var animal = list.ElementAt(i) as GenericObject<Dog<EntityBase>>
// animal is null
DoStuff(animal);
}
for(int i=0;i
如果我使用此代码,它可以工作:
if (list?.ElementAt(i)?.GetType() == typeof(Dog<Chihuahua>))
{
DoStuff(list.ElementAt(i) as Dog<Chihuahua>);
}
if(list?.ElementAt(i)?.GetType()==typeof(Dog))
{
DoStuff(列表元素(i)为狗);
}
我想尽可能地做到这一点,非常感谢
当我完成时,我将分享我正在做的项目!让一个列表包含不同类型的相关类型的能力称为协方差(协方差也是相关的).这是在.NET中分别使用
out
和in
键盘实现的。在.NET 4.5中,协方差内置于IEnumerable
IEnumerable
中,由IList
实现,后者由List
实现
如果你有一个Animal
的列表,你可以将Animal
的任何子类型添加到列表中。但是,当你将该动物取出时,在code中,你会得到一个类型为Animal
的变量,它指向你的Animal
的子类型。因此,看起来你只有Animal
,但它确实是子类型。你可以y按您的建议手动强制转换所有内容
还有另一种解决方法(.NET 4.5),您可以使用dynamic
关键字在运行时确定类型。然后重载DoStuff
方法,它应该按照您想要的方式运行
public class Animal
{
public string Name;
public Animal() { Name = "Animal"; }
}
public class Dog:Animal
{
public Dog() { Name = "Dog"; }
}
[TestMethod]
public void Test()
{
var list = new List<Animal>();
list.Add(new Dog());
list.Add(new Animal());
foreach(dynamic a in list)
{
DoStuff(a);
}
}
public void DoStuff(Animal animal)
{
Console.WriteLine("{0} is wild", animal.Name);
}
public void DoStuff(Dog dog)
{
Console.WriteLine("{0} is not wild", dog.Name);
}
协变和逆变是一个复杂的话题。看看其他的帖子。
让一个列表包含不同类型的相关类型的能力称为协方差(协方差也是相关的).这是在.NET中分别使用
out
和in
键盘实现的。在.NET 4.5中,协方差内置于IEnumerable
IEnumerable
中,由IList
实现,后者由List
实现
如果你有一个Animal
的列表,你可以将Animal
的任何子类型添加到列表中。但是,当你将该动物取出时,在code中,你会得到一个类型为Animal
的变量,它指向你的Animal
的子类型。因此,看起来你只有Animal
,但它确实是子类型。你可以y按您的建议手动强制转换所有内容
还有另一种解决方法(.NET 4.5),您可以使用dynamic
关键字在运行时确定类型。然后重载DoStuff
方法,它应该按照您想要的方式运行
public class Animal
{
public string Name;
public Animal() { Name = "Animal"; }
}
public class Dog:Animal
{
public Dog() { Name = "Dog"; }
}
[TestMethod]
public void Test()
{
var list = new List<Animal>();
list.Add(new Dog());
list.Add(new Animal());
foreach(dynamic a in list)
{
DoStuff(a);
}
}
public void DoStuff(Animal animal)
{
Console.WriteLine("{0} is wild", animal.Name);
}
public void DoStuff(Dog dog)
{
Console.WriteLine("{0} is not wild", dog.Name);
}
协变和逆变是一个复杂的话题。看看其他的帖子。
请将您的代码粘贴为文本。代码截图不是很有用。您正在寻找协方差。好的,谢谢,我一直在尝试,但网络阻止了我,出现了一个错误。您可以粘贴您的实际代码吗?您发布的内容充满了错误。对不起,我的代码适用于一个更大的项目,添加类应该足够@DavidLively请粘贴你的代码以文本形式出现。代码截图不是很有用。你在寻找协方差。好的,谢谢,我一直在尝试,但是网络阻止了我,出现了一个错误。你能粘贴你的实际代码吗?你发布的都是错误。对不起,我的代码在一个更大的项目上工作,添加类应该足够了@davidlively我不知道。非常合作ol.
List
与List
相同,而不是List
…当然,@EdPlunkett是的,使用dynamic关键字将主题从协方差中移开。不知道如何对其进行分类。嗯,它在运行时具有过载分辨率。但我不知道计算机科学家会如何称呼它。对我来说,它感觉有点类似于模式匹配就像Scala/Swift/等中的一样。我不明白为什么没有人对这个答案投赞成票。我是地球上唯一一个不知道动态
的人吗?我不知道。非常酷。它与列表
一样,而不是列表
…当然,@EdPlunkett是的,使用动态关键字移动顶部ic远离协方差。不知道如何分类。嗯,它在运行时是超负荷分辨率。但我不知道计算机科学家会怎么称呼它。对我来说,它感觉有点像Scala/Swift/等中的模式匹配。有点像。我不明白为什么有人不支持这个答案。我是地球上唯一一个不知道这一点的人吗t动态
?