我过去和单身人士一起工作,我知道这是一些解决静态界面问题的人的解决方案。在我的情况下,我不能真正使用单例,因为我有一个我继承的外部类,我无法控制这个(库)。
基本上,我有很多继承自“TableRow”(类中的类)的类,我需要这些类中的每一个都实现某个静态方法(例如:GetStaticIdentifier)。最后,我需要将这些对象存储在其中一个基类型中,并在此特定类型上使用静态方法。
我的问题是,除了使用单身人士之外还有其他解决办法吗?在C#中是否有一个我不知道的功能可以帮助我解决这个问题?
答案 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...
}
}