6

誰もが次のようなコードを見たことがあると思います。

public void Server2ClientEnumConvert( ServerEnum server)
{
    switch(server)
    {
       case ServerEnum.One:
           return ClientEnum.ABC
       //And so on.

この悪さの代わりに、次のようなことができます。

public enum ServerEnum
{
     [Enum2Enum(ClientEnum.ABC)]
     One,
}

これで、リフレクションを使用して ServerEnum をリッピングし、enum 宣言自体から変換マッピングを取得できます。

ここで私が抱えている問題は、Enum2Enum 属性の宣言にあります。

これは機能しますが、オブジェクト o を Enum e に置き換えると機能しません。オブジェクトをコンストラクターに渡すことができるようにしたくありません。他の列挙型のみです。

public class EnumToEnumAttribute : Attribute
{
    public EnumToEnumAttribute(object o){}
}

これはコンパイルに失敗します。

public class EnumToEnumAttribute : Attribute
{
    public EnumToEnumAttribute(Enum e){}
}

コンパイルエラーの原因はありますか? 他に、マップに必要な情報を他にどのように渡すことができますか:

EnumtoEnumAttribute(Type dest, string enumString)

これは冗長すぎるように思えますが、それが唯一の方法である場合は、それを使用すると思います。

4

5 に答える 5

4

ほぼ同じ例を使用して、これを列挙型で直接実現できます。

public enum ServerEnum
{
   One = ClientEnum.ABC,
}

これには、リフレクションを必要としないという利点があり、(私の意見では) 読みやすく、全体的に必要なオーバーヘッドが少なくなります。

于 2008-12-29T19:38:53.150 に答える
0

@Danial Jenningsそこにあるルールを読んで、「列挙型は、パブリックアクセス可能であり、ネストされているタイプ(存在する場合)もパブリックアクセス可能である場合に限ります(セクション17.2)」を見つけました。

コンストラクターで列挙型eを試行すると、引用符で囲まれたルールに基づいてどのように失敗しますか?列挙型であることが、渡された列挙が公に目に見えることを保証しないためですか?これは正しいようです。コンパイル時にこのルールを強制する方法はありますか?

@bdukesあなたは正確に正しいです。もっと考えるべきだった。

実行時の型チェックは、列挙型を他の列挙型にのみマッピングしていることを確認するための唯一のオプションのようです。

于 2008-09-02T17:53:54.100 に答える
0

おそらく構造体を型として使用し、それが Enum 型でない場合は例外をスローします。(Type, string) オプションが object または struct を使用するよりも安全であることがわかりません。

于 2008-09-02T17:41:07.140 に答える
0

属性パラメーターとして含めることができる型の規則は次のとおりです。

于 2008-09-02T17:44:12.487 に答える
0

なぜ辞書を使わないのですか?これは、3.0 で取得した派手なオブジェクト初期化子で初期化された、クラスの静的プロパティである可能性があります。これ以上コードを入力する必要はありません (属性ソリューションを使用してもマッピングを行う必要があります)。

于 2008-09-02T18:15:22.100 に答える