我有以下基类:
public class Base
{
public string LogicalName { get; set; }
public int NumberOfChars { get; set; }
public Base()
{
}
public Base(string logicalName, int numberOfChars)
{
LogicalName = logicalName;
NumberOfChars = numberOfChars;
}
}
和以下派生类:
public class Derived1 : Base
{
public const string EntityLogicalName = "Name1";
public const int EntityNumberOfChars = 30;
public Derived1() : base(EntityLogicalName, EntityNumberOfChars)
{
}
}
public class Derived2 : Base
{
public const string EntityLogicalName = "Name2";
public const int EntityNumberOfChars = 50;
public Derived2()
: base(EntityLogicalName, EntityNumberOfChars)
{
}
}
我也有这个服务提供的功能:
public IEnumerable<T> GetEntities<T>(string entityName, int numberOfChars) where T : Base
{
//Some code to get the entities
}
我的问题是如何通用地调用此函数?我想用看起来像这样的东西来调用它:
public void TestEntities<T>() where T : Base
{
var entities = GetEntities<T>(T.EntityLogicalName, T.EntityNumberOfChars);
//some other code to test the entities
}
这当然行不通,因为此时 T 是未知的。我怎样才能完成类似的事情? EntityLogicalName 和 EntityNumberOfChars 是所有 Base 派生类都具有的特征,它们永远不会因每个派生类而改变。我是否可以在不实例化对象的情况下或以其他我看不到的方式从 Base 类获取它们?
最佳答案
用getter抽象属性替换常量
public abstract class Base
{
public abstract string LogicalName { get; }
public abstract int NumberOfChars { get; }
public Base()
{
}
}
public class Derived1 : Base
{
public string LogicalName { get { return "Name1"; } }
public int NumberOfChars { get { return 30; } }
public Derived1() : base()
{
}
}
此外,您还可以将一些逻辑放入覆盖的 getter 中,例如:
...
public string LogicalName { get { return this.EntityMap.Name; } }
...
更新:您不想从类实例化对象但希望能够以强类型方式获取该字符串这一事实可以通过另一种方式处理。它与上面的答案完全分开(因为你不能在 c# 中覆盖静态 Prop )。考虑以下代码。我们在这里再添加一个类,但是 LocatorInner 可以是 BaseClass 的成员。我们在几个现有的应用程序中大量使用这种方法。:
public class Locator
{
public static class LocatorInner<T> where T : BaseClass
{
public static string Name { get; set; }
}
public static string GetName<T>() where T : BaseClass
{
return LocatorInner<T>.Name;
}
public static void SetName<T>(string name) where T : BaseClass
{
LocatorInner<T>.Name = name;
}
}
public class BaseClass
{
}
public class DerivedClass: BaseClass
{
static DerivedClass()
{
Locator.LocatorInner<DerivedClass>.Name = "me";
}
}
public class TestClass<T> where T : BaseClass
{
public void Method()
{
var name = Locator.GetName<T>();
}
}
关于c# - 使用泛型 C# 访问 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31947771/