我过去曾使用过单例,我知道对于一些试图解决静态接口(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/