如何使用标记属性而不是标记接口?

时间:2019-01-24 16:33:45

标签: c# interface

我已经阅读了很多有关标记界面不好的东西(或没有,看起来不太清楚)。

我不太了解“标记属性”的工作原理,并且创建了一个小示例来说明我的问题:

我有一个定义<httpRuntime requestValidationMode="2.0" targetFramework="4.6" />的接口,另一个有定义Robot的接口。事实证明,它存在一个类Ninja,可以将内容相乘,但只能在FooRobot都得到某人的帮助下进行。

Ninja

据我了解,IRobotNinja是标记类:它没有成员。

如何获得相同的信息(尤其是在编译时确保仅using System; public class Program { public static void Main() { IRobotNinja robotNinja = new RobotNinjaAlways10(); Foo foo = new Foo(); Console.WriteLine(foo.Multiply(1, 1, robotNinja)); } } public class Foo { public int Multiply(int leftOperand, int rightOperand, IRobotNinja robotNinja) { return leftOperand * rightOperand * robotNinja.availableShuriken * robotNinja.batteryLevel; } } public interface IRobot { int batteryLevel { get; } } public interface INinja { int availableShuriken { get; } } public interface IRobotNinja : IRobot, INinja { } public class RobotNinjaAlways10 : IRobotNinja { public int batteryLevel { get { return 10; } } public int availableShuriken { get { return 10; } } } / Robot会帮助Ninja

1 个答案:

答案 0 :(得分:4)

为避免创建另一个接口,可以使Multiplyconstraints通用:

public class Foo
{
    public int Multiply<T>(int leftOperand, int rightOperand, T robotNinja)
         where T : IRobot, INinja
    {
        return leftOperand * rightOperand * robotNinja.availableShuriken
                           * robotNinja.batteryLevel;
    }
}