在C#中创建虚拟通用方法

栏目: ASP.NET · 发布时间: 7年前

内容简介:翻译自:https://stackoverflow.com/questions/21236934/creating-a-virtual-generic-method-in-c-sharp

我有一些像这样的基类:

public class AbstractData
{
    public int ID { get; set; }
}

public class Person: AbstractData
{
    public string Name { get; set; }
}

public class AbstractManager<T> where T: AbstractData
{
    public virtual List<T> GetAll()
    {
    }

    public virtual T GetOne(int id)
    {
    }
}

public class PersonManager: AbstractManager<Person>
{
    public override List<Person> GetAll()
    {
        //...
    }

    public override Person GetOne(int id)
    {
        //...
    }
}

现在,我有一个Windows窗体基类,如下所示:

public class BaseForm: Form
{
    public virtual AbstractManager<T> GetManager<T>() where T: AbstractData
    {
        return null;
    }
}

和派生形式:

public class PersonForm: BaseForm
{
    public override AbstractManager<T> GetManager<T>()
    {
        return new PersonManager();
    }
}

问题是,我一直在PersonForm类上遇到编译错误:

Cannot implicitly convert type ‘PersonManager’ to ‘AbstractManager<T>’

有没有一种方法可以创建这个虚方法并使从BaseForm派生的每个类都返回AbstractManager的具体表示?

如果我删除了AbstractManager类上的泛型,那么我编译好(有一些代码更改),但GetAll方法不能返回List<T>.它必须返回List<AbstractData>相反,这会导致从List<Person>转换时出现问题列出<AbstractData>.

任何帮助,将不胜感激.

首先,请不要这样做:

class C<T>
{
    void M<T>(T t) { }
}

现在我们在范围内有两个名为T的东西,它们是不同的.这是合法的,但非常令人困惑.为类型参数选择更好的名称.

让我们简化你的例子:

class FruitBasket<T> where T : Fruit { }
class AppleBasket : FruitBasket<Apple> { }
class C
{
    public static FruitBasket<T> GetBasket<T>() where T: Fruit 
    {
        return new AppleBasket();
    }
}

现在你明白为什么这是错的吗?如果有人打电话给C.GetBasket<Orange>()然后递给他们一篮子苹果怎么办?

Any help would be appreciated.

什么是走出一个洞的第一步?停止挖掘.

你有Genericity Happiness Disease,这对C#程序员来说很常见,他们正在发现泛型类型系统的强大功能,然后想要将它用于所有有意义的事情.停止尝试捕获泛型类型系统中业务流程中的所有关系;这不是它的设计目标.

测试是:你能说“苹果篮子是一篮子苹果,苹果是一种水果”,并且有一个不是 程序员 同意你的人吗?是.你能否说“一个人经理是一个抽象的经理,人是一种抽象的数据”并且有一个不是程序员的人同意你的看法?不.然后,您没有在类型系统中成功建模业务域.重新开始,避免使用泛型,并尝试在有意义的类型之间建立关系.

翻译自:https://stackoverflow.com/questions/21236934/creating-a-virtual-generic-method-in-c-sharp


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

新零售:低价高效的数据赋能之路

新零售:低价高效的数据赋能之路

刘润 / 中信出版集团 / 2018-9 / 65.00元

小米新零售,如何做到20倍坪效? 天猫小店,如何利用大数据助力线下零售? 盒马鲜生,为什么坚持必须用App才能买单? 名创优品,实体小店在电商冲击下,如何拥抱春天? 新零售的未来在何方?什么样的思维模式才可应对? 新零售,不是商界大佬的专用名词,它就在我们生活触手可及的各个角落——小到便利店的酸奶,大到京东商城的冰箱,都蕴含着消费者、货物、经营场所三者共同作用的经济逻......一起来看看 《新零售:低价高效的数据赋能之路》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具