2012-03-12 90 views
0

我想找到在C#示例DEFS类优雅的解决方案: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实例。长度,重量,高度仅用于插图,还有更多。

编辑:

我选择了泛型,因为我认为有一种方法(++和C一样),使concatination在编译的时候。有可能这样做吗?

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

谢谢!

+2

你试图在这里达到什么目的?这可能很重要......这些值是什么意思*意思是*? – 2012-03-12 09:44:16

+1

是否有任何特殊原因需要字符串字面名称来引用特定的类?也许如果你阐述了你希望达到的目标,我们可以找到更好的方法! – 2012-03-12 09:44:15

+0

更优雅的解决方案是不将类名包含在变量名中。你为什么想要这样做? – ken2k 2012-03-12 09:44:53

回答

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"); } } 

    … 
} 

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

+0

这是很好的解决方案,但有很多参数和频繁调用,我选择泛型,因为我认为有办法使编译时间的连接? – 2012-03-12 10:23:23

+1

.Net泛型不是C++的寺庙,它们不是在编译时计算的。此外,你应该衡量这些连接实际上对你很重要。如果你知道它们的确如此,那么在程序启动时计算它们应该仍然很好,这就是我的第一个解决方案。 (你可以修改第二个来做同样的事。) – svick 2012-03-12 10:29:31