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
动态