C#generic defs class

时间:2012-03-12 09:41:16

标签: c# generics

我想在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;
}

编辑:

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

编辑:

我选择了Generics,因为我认为有一种方法可以在编译时进行连接(比如在c ++中)。有可能吗?

你能帮我找到更优雅的解决方案吗?

感谢!!!

1 个答案:

答案 0 :(得分:1)

在我看来,您实际上并不需要属性为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"); } }

     …
}

执行此操作不会避免重复连接字符串,但我不确定为什么要避免这种情况,这样做应该非常快。