c# - 静态接口(interface)等效 C#

标签 c# inheritance interface static

我过去曾使用过单例,我知道对于一些试图解决静态接口(interface)问题的人来说,这是一种解决方案。就我而言,我不能真正使用单例,因为我有一个继承自的外部类,而我无法控制这个类(库)。

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

我的问题是,除了使用单例之外,还有其他解决方案吗? C# 中是否有我不知道的功能可以帮助我解决此问题?

最佳答案

您似乎想提供一些元信息以及 TableRow 的子类;无需实例化特定子类即可检索的元信息。

虽然 .NET 缺少静态接口(interface)和静态多态性,但这可以(在某种程度上,见下文)用 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
{
    // ...
}

然后您可以检索 Type MyTableRow 的实例(或 TableRow 的任何其他子类)并使用 GetCustomAttributes method检索 StaticIdentifierAttribute 实例并读出存储在该类的StaticIdentifier` 属性中的值。

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

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

关于c# - 静态接口(interface)等效 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30760984/

相关文章:

c# - 新的 `System.Text.Json` 是否有必需的 property 属性?

python - 使用基类成员来跟踪派生类实例

Javascript 不继承原型(prototype)属性

Activity中的Java类调用方法

c# - 如何读取闭合多边形内的像素?

c# - 在 C# 中将无符号 16 位 int 转换为有符号 16 位 int

generics - Kotlin 继承

c# - 带有数据集的 C# 中的 "using"关键字

c# - 更改实现具有对象类型属性的接口(interface)的类中的属性类型

c# - 用于多个数据库的 ADO.NET 或 OLE?