静态接口等效C#

时间:2015-06-10 15:36:43

标签: c# inheritance interface static

我过去和单身人士一起工作,我知道这是一些解决静态界面问题的人的解决方案。在我的情况下,我不能真正使用单例,因为我有一个我继承的外部类,我无法控制这个(库)。

基本上,我有很多继承自“TableRow”(类中的类)的类,我需要这些类中的每一个都实现某个静态方法(例如:GetStaticIdentifier)。最后,我需要将这些对象存储在其中一个基类型中,并在此特定类型上使用静态方法。

我的问题是,除了使用单身人士之外还有其他解决办法吗?在C#中是否有一个我不知道的功能可以帮助我解决这个问题?

3 个答案:

答案 0 :(得分:5)

您似乎想要提供一些元信息以及TableRow的子类;可以在不实例化特定子类的情况下检索的元信息。

虽然.NET缺少静态接口和静态多态,但可以(在某种程度上,见下文)使用custom attributes来解决。换句话说,您可以定义一个自定义属性类,用于存储要与类型关联的信息:

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class StaticIdentifierAttribute : Attribute
{
    public StaticIdentifierAttribute(int id)
    {
        this.staticIdentifier = id;
    }

    private readonly int staticIdentifier;

    public int StaticIdentifier {
        get {
            return staticIdentifier;
        }
    }
}

然后,您可以将此自定义属性应用于TableRow子类:

[StaticIdentifier(42)]
public class MyTableRow : TableRow
{
    // ...
}

然后,您可以检索MyTableRow(或TableRow的任何其他子类)的Type实例,并使用GetCustomAttributes method检索StaticIdentifierAttribute instance and read out the value stored in its StaticIdentifier该课程的财产。

与静态接口和静态多态性相比,缺点是确保每个TableRow子类实际具有该属性的编译时间;你必须在运行时捕获它(并抛出异常,或忽略相应的TableRow子类)。

此外,您无法确保该属性应用于TableRow子类,但是,虽然这可能有些不整洁,但它并不重要(如果是应用于另一个类,它只会在那里没有任何影响,因为没有代码可以为其他类处理它。)

答案 1 :(得分:0)

如果你打结自己,你可以进行少量的编译器检查。但是,为所需的每个标识符实例声明一个新的结构类型无疑是疯狂的。

public interface IIdentifier
{
    int Id { get; }
}

public class BaseClass { }

public class ClassWithId<T> : BaseClass where T :  IIdentifier, new()
{
    public static int Id { get { return (new T()).Id; } }
}

public struct StaticId1 : IIdentifier
{
    public int Id { get { return 1; } }
}

public struct StaticId2 : IIdentifier
{
    public int Id { get { return 2; } }
}

//Testing
Console.WriteLine(ClassWithId<StaticId1>.Id);   //outputs 1
Console.WriteLine(ClassWithId<StaticId2>.Id);   //outputs 2

答案 2 :(得分:0)

如何将静态类与泛型(或非)扩展方法一起使用?

public static class Helper
{
  fields...

  public static void DoSomething<T>(this T obj)
  {
     do something...
  }
}