用于泛型的抽象常量
本文关键字:常量 抽象 泛型 用于 | 更新日期: 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
的实例来读取该属性