2017-10-31 4 views
2

文字列定数を含むクラスとカウンタオブジェクトを表す読み取り専用オブジェクトを含むクラスがあります。文字列定数に対応するカウンタの文字列表現をタグ付けするカスタム属性を作成しました。属性を使用して文字列constをカウンタオブジェクトにリンクする良い方法はありますか?ここでリフレクションを使用してあるクラスから別のクラスの読み取り専用オブジェクトフィールドにリンクする方法

は、文字列のconstの例である:ここで

public static class OperatorDiagnosticsConstants 
{ 
    [CounterType(CounterType = "ReagentProbe1")] 
    public const string R1_PROBE_CODE = "SACT-158"; 
} 

は読み取り専用カウンタオブジェクトを含むクラスです。

public class MaintenanceCounterType : CounterTypeEnum 
{ 
    public static readonly MaintenanceCounterType ReagentProbe1 = new MaintenanceCounterType(MaintenanceCounterTypeConstants.ReagentProbe1ID); 
} 

私は2つの解決策を考えるが、よりがある場合は疑問に思うことができますエレガントな方法? 最初に、これらの2つのクラスを使用するコードにswitch文を使用してconvertメソッドを持たせることができます。 MaintenanceCounterType

public MaintenanceCounterType Convert(string attributeStr) 
{ 
    switch (attributeStr) 
    { 
     case "ReagentProbe1": 
     return MaintenanceCounterType.ReagentProbe1; 
     ...... 
    } 
    } 

または私は私がそれらを一致させるためにMaintenanceCounterTypeと使用反射に同じカスタム属性CounterTypeを追加することができると思いを返すために、属性文字列に切り替えます。私は、カスタム属性の文字列プロパティの同等性をチェックすると思いますか?

もっと洗練されたソリューションをお探しですか?ありがとう!

+1

あなたは実際にどのような問題を解決しようとしていますか? –

+2

あなたがしようとしていることが明確ではありません。おそらくレジストリパターンに類似したものを達成しようとしていますか? –

+0

「リンク」は*正確に*あなたは何を意味しますか? –

答えて

0

このアプローチを使用する代わりに、enum定数と文字列を変換するためのAPIに機能を持つC#enumを使用することを検討することもできます。 enum定数(API)に文字列を変換

public class ConvertEnumToStringExample { 
    enum Colors { Red, Green, Blue, Yellow }; 

    public static void Main() { 

     Console.WriteLine("The 4th value of the Colors Enum is {0}", Enum.GetName(typeof(Colors), 3)); 
     Console.WriteLine("The 4th value of the Colors Enum is {0}", Enum.GetName(typeof(Colors), Colors.Yellow)); 
    } 
} 

:列(API)に定列挙変換

public class ConvertStringToEnumExample { 
    enum Colors { Red, Green, Blue, Yellow }; 

    public static void Main() { 

     string colorString = "Yellow"; 
     Colors colorValue = (Colors) Enum.Parse(typeof(Colors), colorString); 

     // colorValue is now Colors.Yellow 

    } 
} 
0

は改善における即時低下が使用するであろうnameof演算子を使用しているため、リンクはリファクタリング/リネームを継承します。

[CounterType(CounterType = nameof(MaintenanceCounterType.ReagentProbe1)] 
public const string R1_PROBE_CODE = "SACT-158"; 
あなたが提案したよう

変換方法はまた、リフレクションを使用して単純化することができます。

public MaintenanceCounterType Convert(string attributeStr) 
{ 
    return typeof (MaintenanceCounterType).GetField(attributeStr); 
} 

言われて、これらの状況では、私の好ましい選択肢は、新しいクラスで文字列定数を交換することであること:

public static class OperatorDiagnosticsConstant 
{ 
    public readonly string Value; 
    public readonly MaintenanceCounterType CounterType; 

    private OperatorDiagnosticsConstant(string value, MaintenanceCounterType counterType) 
    { 
     Value = value; 
     CounterType = counterType; 
    } 

    public static OperatorDiagnosticsConstant R1_PROBE_CODE = new OperatorDiagnosticsConstant("SACT-158", MaintenanceCounterType.ReagentProbe1); 
} 

OperatorDiagnosticsConstants.R1_PROBE_CODEを呼び出す既存のコードとの下位互換性を維持する場合は、暗黙的な文字列キャスト演算子を追加できます。

public static class OperatorDiagnosticsConstant 
{ 
    ... 

    public override stirng ToString() 
    { 
     return Value; 
    } 

    public static implicit operator string(OperatorDiagnosticsConstant constant) 
    { 
     return constant.ToString(); 
    } 
} 
関連する問題