c# - 使用泛型 C# 访问 const

标签 c# generics inheritance

我有以下基类:

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/

相关文章:

如果属性访问 C# Struct 方法不保存值

java - 静态方法中的有界类型参数

C++:模板化基类的范围?

java - 从Java中的一堆类中随机选择

c# - Entity Framework native sql 映射到类

c# - 如何获取 LightSwitch 中 IContentItemProxy 上的 SetBinding 方法的路径?

c# - 使用 C# 以编程方式登录 Microsoft Online 网站

java - 如何创建一个以泛型类作为类型的泛型类?

java - 通用内部类构造函数接受不同类型的参数设置什么?

C++ - 允许通过基类(接口(interface))访问,禁止通过派生类(具体实现)访问?