我的问题是由于某种原因,当我通过泛型传递继承类时,不能将其用作基类。
让我们假设下面的代码来描述这个想法
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<Person>
与Case<GoodPerson>
类型不同
很像..Case<int>
与Case<string>
的类型不同
您的反射器期望一个强类型Case<Person>
,但是您要为其提供一个不同的强类型Case<GoodPerson>
(因此,就像为期望Case<string>
的方法提供Case<int>
一样)
为了使它起作用,请使您的反射器接受以下情况:T是一个人或一个人的派生类,如下所示:
public class TypeReflector
{
public Person Reflect<T>(Case<T> person) where T:Person
{
return person.PersonType;
}
}
但是下面是我真正想要实现的,基于描述符类型中提供的属性获取类型的实例。一旦实例化的类型Person
不能在没有其他GoodPerson
关键字的情况下“提升”到new
实例。.(顺便说一句,相反的情况是可能的,创建一个GoodPerson
并转换为更基本的Person
类)
using System;
namespace ConsoleApp25
{
class Program
{
static void Main(string[] args)
{
var personDescriptor = new PersonDescriptor { IsGood = true };
var resultPerson = personDescriptor.CreateInstance();
Console.WriteLine(resultPerson.IsGood);
Console.WriteLine(resultPerson.GetType().Name);
Console.ReadLine();
}
}
public class PersonDescriptor
{
public bool IsGood { get; set; }
public Person CreateInstance()
{
if (IsGood)
return new GoodPerson(); //create new instance!
return new BadPerson(); //create new instance!
}
}
public abstract class Person
{
public abstract bool IsGood { get; }
}
public class GoodPerson : Person
{
public override bool IsGood { get; } = true;
}
public class BadPerson : Person
{
public override bool IsGood { get; } = false;
}
}
与哪些运算符>>兼容 - java我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…
>> Python中的运算符 - python>>运算符做什么?例如,以下操作10 >> 1 = 5有什么作用? 参考方案 它是右移运算符,将所有位“右移”一次。二进制10是1010移到右边变成0101这是5
Python 3运算符>>打印到文件 - python我有以下Python代码编写项目的依赖文件。它可以在Python 2.x上正常工作,但是在使用Python 3进行测试时会报告错误。depend = None if not nmake: depend = open(".depend", "a") dependmak = open(".depend.mak…
如何从JavaBeanObject写入文件(泛型) - java我想知道如何使用BufferedWriter从对象(泛型)写入文件。我尝试了下面的代码,但无法正常工作。我想打印列表中存在的所有值。我是否需要进行任何类型转换或使用迭代器并使用get方法或for循环。如果我做错了什么,那么将值写入PrintWriter以外的文件的方法是什么?我尝试使用不同的writer,但对我没有任何帮助。我不明白前进的道路。从我的程序中获…
剃刀付款集成->如何通过关闭按钮X检测剃刀付款模型是否关闭 - javascript当用户关闭而无需付款时,我在CI框架中使用Razorpay,请创建razor支付模型,然后取消订单,我希望按状态更改为已取消的状态触发查询。所以我怎么能检测到这一点。我已经通过单击jQuery单击关闭功能但无法使用... javascript大神给出的解决方案 Razorpay提供了JS方法来检测模式关闭。您编写的任何JS代码都不会在结帐页面上运行,因为它是…