具有继承的C#泛型 - c#

我的问题是由于某种原因,当我通过泛型传递继承类时,不能将其用作基类。

让我们假设下面的代码来描述这个想法

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代码都不会在结帐页面上运行,因为它是…