与泛型一起使用的抽象常量

时间:2014-10-23 13:57:31

标签: c# generics constants

我有多个班级。每个都定义了两个常量(常量值不同,但我知道每个类都有这2个常量)。这些常量用作DbColumn属性的值(它不能使用Properties)。我想在另一个类中使用这个类作为泛型,并获取常量的值。 这是一个小例子:

public abstract class BaseAssignment
{
    //Won't work
    public (abstract) const string Item;
    public (abstract) const string AssignedItem;
}

public class AssignemtA : BaseAssignment
{
    public const string Item = "A";
    public const string AssignedItem = "1";

    [DbColumn(Item)]
    ...
    [DbColumn(AssignedItem)]
    ...
}

public class AssignmentB : BaseAssignment
{
    public const string Item = "B";
    public const string AssignedItem = "2";

    [DbColumn(Item)]
    ...
    [DbColumn(AssignedItem)]
    ...
}

public class AssignmentHandler<Tobj> where Tobj : BaseAssignment
{
    public void Test()
    {
        Console.WriteLine(Tobj.AssignedItem);
    }
}

BaseAssignment类不起作用,因为它无法定义抽象常量。有没有可能解决这个问题?

1 个答案:

答案 0 :(得分:3)

摘要和常量是正交的。常量是一种静态成员,而抽象意味着它参与继承,应该是实例成员。

我的建议是使用抽象属性。如果你不能使用属性,那么你必须使用反射来读取常量值。

以下是您如何处理反思:

public class AssignmentHandler<TObj> where TObj : BaseAssignment
{
    public void Test()
    {
        var assignedItemField = typeof(TObj).GetField("AssignedItem", BindingFlags.Static | BindingFlags.Public);
        Console.WriteLine(assignedItemField .GetRawConstantValue());
    }
}

注意:即使您使用抽象属性,也不能使用Tobj.AssignedItem。您需要Tobj的实例才能阅读该属性。