内容简介:翻译自: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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- openEuler 20.09 发布,带来通用虚拟机运行时
- Kubernetes 1.12发布:Kubelet TLS Bootstrap与Azure虚拟机规模集(VMSS)迎来通用版本
- Kubernetes 1.12发布:Kubelet TLS Bootstrap与Azure虚拟机规模集(VMSS)迎来通用版本
- SOFAMesh中的多协议通用解决方案X-protocol介绍系列(1)——DNS通用寻址方案
- CCM通用计算工具
- 通用xxe检测方法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Making Things See
Greg Borenstein / Make / 2012-2-3 / USD 39.99
Welcome to the Vision Revolution. With Microsoft's Kinect leading the way, you can now use 3D computer vision technology to build digital 3D models of people and objects that you can manipulate with g......一起来看看 《Making Things See》 这本书的介绍吧!