静态成员和接口

时间:2014-03-20 07:01:52

标签: c# .net reflection interface static

我刚刚对这个主题进行了一些SO问题,发现这是(目前?)不可能在接口中定义静态成员或者使静态方法成为虚拟。我现在正在努力应对这种情况。让我试着用一个简单的例子来描述它:

我有一个名为IAnimal的界面,其定义如下:

interface IAnimal {
    ...
    int Chromosomes {get; } //should ideally be static, but that's not allowed!
    ...
}

然后我有一个实现IAnimal的基类Animal,并提供了所有动物共有的一些方法的实现:

abstract class Animal : IAnimal { 
    ...
    public abstract int Chromosomes {get; } //necessary becuz of IAnimal
    ...
}

在此之下,我有DogCatZebra类继承自Animal,并为其物种提供此属性的具体实现。

现在问题:这些类是在运行时发现的(通过pluggable-modules的Assembly.LoadFile() becuz)。发现的类保存在List<System.Type>中,我们后来用它来创建具体的狗和猫。用于创建动物的输入参数是染色体编号,因此例如他们会问:创建具有72条染色体的类型的动物。所以我需要以某种方式获得染色体属性的值Type中的每个List并返回第一个匹配的Type

由于Chromosomes不是静态的(如果是,我可以轻松地run a static member of a given Type),我是否被迫创建每种类型的临时对象,然后用它来调用Chromosomes,或者有没有更好的办法?我的List中的所有元素都被保证为IAnimal,如果这有帮助的话。

1 个答案:

答案 0 :(得分:2)

基本上C#型系统并没有为此做好准备。这不是经常一个问题,但当它确实出现时,它很痛苦:(您可能想要考虑的一些选项,所有这些都是从删除现有属性开始的:

  • 为类型本身(DogTypeAnimalType等)创建单独的类型层次结构,如果有用,也可以负责创建实例。这往往会有点痛苦。
  • 向类型添加属性,指示染色体的数量 - 当然,这仅在值恒定时才有效。然后,您可以使用反射查找属性值。但它不会在编译时强制执行。
  • 创建一个可以使用反射调用的静态属性,然后添加单元测试以确保实现接口的每个类型都具有静态属性