我想创建一个只有两个字段的超类:Id和Timestamp,并具有一个可以使用该超类的任何后代的类。有点像使用泛型,但是我知道它将至少具有一个Id和timestamp字段。
我可以使用反射来查找属性,但是我将使用它来一次处理数千个对象,并且给人的印象是我会对性能产生重大影响(如果我想错误)。
这是我想要做的一个简单而愚蠢的例子。说我有以下超类:
public class Shape
{
public double Area { get; set; }
}
我还实现了平方,它源自Shape:
class Square : Shape
{
public int SideLength { get; set; }
// more stuff
}
我要做的是制作一个ShapeHandler类,该类可以接受任何类型的形状并可以获取其面积。但是以下代码不正确:
class ShapeHandler<Shape>
{
private Shape MyShape;
public double GetArea()
{
return MyShape.Area;
}
}
我希望能够做到这一点:
var sh = new ShapeHandler<Square>();
sh.GetArea();
这个问题有意义吗?有做我想做的正确方法吗?
答案 0 :(得分:3)
您的通用语法有误:
class ShapeHandler<Shape>
正在使您的ShapeHandler
成为通用类型,但它并不限于Shape
,它实际上将Type参数称为“ Shape”。
您想要做的是:
public class ShapeHandler<T> where T: Shape
{
private T MyShape;
public double GetArea()
{
return MyShape.Area;
}
}
这意味着您的ShapeHandler
只能用T
(或继承自Shape
的某种类型(Shape
)实例化
问自己一件事是:
仅使用Shape
类型的参数时使用泛型有意义吗?
根据您对记录某些属性的编辑,请考虑以下问题:
您有两个对象,一个形状和一个正方形:
var square = new Square() { Area = 4.0, SideLength = 2 };
var shape = new Shape() { Area = 3.0 };
您想打印出Area属性(从技术上来说,它们均为Shape
,因此它们都具有Area
属性。您可以创建一个接受Shape
参数的方法,然后您可以访问Shape具有的任何内容:
public static void LogArea(Shape shape)
{
Console.WriteLine(shape.Area);
}
我用小提琴来演示here
答案 1 :(得分:1)
这不是您要查找的Shape
。
class ShapeHandler<Shape>
{
private Shape MyShape;
该代码段中的Shape
不是Shape
类,它是称为的通用类型参数 Shape
。就所有意图和目的而言,其文字均为object
。
如果您确实希望ShapeHandler
是通用的,则通常会做一个接口(IShape
)和一个通用类型约束:
class ShapeHandler<T> where T : IShape
尽管约束也可以针对具体的类。但是,没有任何真正的理由让它成为通用的 ,只需接受/存储一个基类引用并称其为好。
class ShapeHandler
{
public ShapeHandler(Shape shape)
{
MyShape = shape;
}
}
另一件事,MyShape
是代码中的一个字段,因此应为camelCase(myShape
)