C# generic defs class

本文关键字:class defs generic | 更新日期: 2023-09-27 18:27:23

我想为C#中的defs类找到优雅的解决方案示例:

代替:

class Class1
{
    public static readonly string length = "length_Class1";
    public static readonly string height = "height_Class1";
    public static readonly string width = "width_Class1";
}
class Class2
{
    public static readonly string length = "length_Class2";
    public static readonly string height = "height_Class2";
    public static readonly string width = "width_Class2";
}

创建模板类。我想到了以下解决方案,但它看起来并不那么优雅:

internal abstract class AClass
{
}
internal class Class1 : AClass
{
}
internal class Class2 : AClass
{
}
class Class1<T> where T : AClass
{
    public static readonly string length = "length_" + typeof(T).Name;
    public static readonly string height = "height_" + typeof(T).Name;
    public static readonly string width = "width_" + typeof(T).Name;
}

编辑:

我有很多从外部数据源获取/设置的参数名称,我希望有两个Def实例。长度、重量、高度仅用于说明,还有更多。

编辑:

我选择Generics是因为我认为有一种方法可以在编译时进行连接(就像在c++中一样)。有可能做到吗?

你能帮我提供更优雅的解决方案吗?

谢谢!!!

C# generic defs class

在我看来,实际上并不需要属性是static,也不需要类是泛型。所以,你可以做一些类似的事情:

class ParameterNames
{
    public string Length { get; private set; }
    public string Height { get; private set; }
    public string Width { get; private set; }
    public ParameterNames(string className)
    {
        Length = "length_" + className;
        Height = "height_" + className;
        Width = "width_" + className;
    }
}

尽管您可能想要重构代码,以便访问外部资源的代码根本不需要处理这些参数名称:

abstract class ExternalResource
{
    private readonly string m_className;
    protected ExternalResource(string classname)
    {
        m_className = className;
    }
    protected object GetParameterValue(string name)
    {
        string fullName = name + '_' + m_className;
        // actually access the resource using fullName
    }
}
public class SpecificParameters : ExternalResource
{
     public SpecificParameters(string className)
         : base(className)
     { }
     public int Length { get { return (int)GetParameterValue("length"); } }
     …
}

这样做不会避免重复串联字符串,但我不确定为什么要避免,这样做应该很快。