用于泛型的抽象常量

本文关键字:常量 抽象 泛型 用于 | 更新日期: 2023-09-27 18:27:38

我有多个类。每个类都定义了两个常量(常量值不同,但我知道每个类都有这两个常量)。这些常量用作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类将不起作用,因为它不可能定义抽象常量。有可能解决这个问题吗?

用于泛型的抽象常量

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

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

以下是如何处理反射:

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的实例来读取该属性