2012-03-12 108 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