我的问题是出于某种原因,当我通过泛型传递派生类作为基类时无法使用。
假设下面的代码来描述这个想法:
public class Person
{
public virtual bool IsGood { get; }
}
public class GoodPerson : Person
{
public override bool IsGood { get; } = true;
}
public class BadPerson : Person
{
public override bool IsGood { get; } = false;
}
public class Case<T>
{
public T PersonType { get; set; }
}
public class TypeReflector
{
public Person Reflect(Case<Person> person)
{
if (person.PersonType.IsGood)
return (GoodPerson)person.PersonType;
return (BadPerson)person.PersonType;
}
}
并且像下面这样被称为:
var reflector = new TypeReflector();
var result = reflector.Reflect(new Case<GoodPerson>());
为什么方法Reflect
不能与Case<GoodPerson>
一起调用,
但是没有Case
也是可以的,如下所示:
public Person Reflect(Person person)
{
if (person.IsGood)
return (GoodPerson)person;
return (BadPerson)person;
}
Case<GoodPerson>
不是Case<Person>
的一种。 - SweeperCase<Person>
和Case<GoodPerson>
显然是不同的类型,你可以引入一个接口并使用协变。 - Pavel Anikhouski