2012-03-12 15 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; 
} 

編集:私は、外部データソースから設定私が得るパラメータ名/の多くを持って

、私が持っていると思いますそのための2つのインスタンスインスタンス。長さ、重さ、高さはイラストだけです。

EDIT:

私はコンパイル時に連結のを作るための方法は、(C++のような)があることと思うので、私はジェネリックを選びました。それは可能ですか?

もっと洗練されたソリューションを教えてください。

ありがとうございました!

+2

ここであなたが達成しようとしていることは何ですか?それはおそらく重要です...これらの値は*どういう意味ですか? –

+1

特定のクラスを参照するために文字列リテラル名が必要な特別な理由はありますか?おそらく、あなたが達成しようとしていることを詳述すれば、より良い方法を見つけることができます! –

+0

より洗練されたソリューションは、変数名にクラス名を含めないことです。なぜあなたはそうしたいのですか? – ken2k

答えて

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

それは良い解決策ですが、多くのパラメータがあり、頻繁に呼び出されます、私はジェネリックを選択しました。コンパイル時の連結? –

+1

.Net genericsはC++テンプルではなく、コンパイル時には計算されません。また、連結が実際にあなたにとって重要であることを測定する必要があります。そして、あなたがそれらを知っているなら、プログラムが始まるときにそれらを一度計算することはまだうまくいくはずです。それが私の最初の解決策です。 (そして、あなたは同じことをするために2番目のものを変更することができます)。 – svick

関連する問題