各メンバーにDescriptionAttribute
の列挙型があります。 私はこのDescriptionAttribute
をWCFで送ることができないので(難しい方法を学んだ)、私は説明付きの辞書を私に送るメソッドを作成しようとしています。Enumの説明をWCFでどうにかして "総称的"にする
public IDictionary<Enum, string> GetEnumDescriptionsList(string enumtype)
{
Type t = Type.GetType(enumtype);
if (t.BaseType != typeof(Enum))
{
return null;
}
var returnvalue = new Dictionary<Enum, string>();
foreach (Enum value in Enum.GetValues(t))
{
returnvalue.Add(value, value.GetDescription());
}
return returnvalue;
}
メソッドの呼び出し:: 周りの苦労のビットの後、私は私のWCFサービスでは、このメソッドを作ってみた
var myDict = GetEnumDescriptionsList(typeof (UserType).ToString());
を私はその呼び出しを行うとき、これは正常に動作しますメソッドと同じクラスで、私はWCFを介して呼び出しを行うときにnullが返されます。 デバッグ後、私は文字列パラメータが "間違った"値を保持していることを知りました。つまり、クライアント側のUserType.ToString()
には、WCFサービスの名前空間とは異なる名前空間があります。
を参照してください。this postはその問題について説明しました。このとき
が、私はここにかなりこだわっている:ジェネリック医薬品はできません、タイプType
のパラメータとしてタイプを送ること 一つの最後のオプションは、各列挙型のための方法を書くことで...、(
see this post)ことはできません私は(現時点では9)がありますが、それよりも良い方法があるという気持ちがあります。
ありがとうございます。
UPDATE: I辞書を作成するために、コードの一部を以下た@KeithSによって提供されるソリューションの使用:Webサービスに
Assembly asm = Assembly.GetExecutingAssembly();
foreach (Type type in asm.GetTypes())
{
if (type.IsEnum)
{
enumTypeNames.Add(type.Name, type.AssemblyQualifiedName);
}
}
方法は、所与のタイプのすべてのenummember用辞書を返します。
public IDictionary<string, string> GetEnumDescriptionsList(string enumtypename)
{
var enumtypenames = EnumMethods.GetEnumTypeNames();
var returnvalue = new Dictionary<string, string>();
string fullyQualifiedTypeName;
enumtypenames.TryGetValue(enumtypename, out fullyQualifiedTypeName);
var enumType = Type.GetType(fullyQualifiedTypeName);
foreach (Enum value in Enum.GetValues(enumType))
{
returnvalue.Add(value.ToString(), value.GetDescription());
}
return returnvalue;
}
クライアントからの呼び出し:
var returnvalue = client.GetEnumDescriptionsList(typeof(UserType).Name);
私は数日前に投稿した問題を除いて、魔法のように動作し、:Name of enum in innerclass changes through WCF-service
のように私は、クライアントからの電話をかける:それは名前を与えます
var returnvalue = client.GetEnumDescriptionsList(typeof(ActionsMailDirectLinkContent).Name);
「ActionsMailDirectLinkContent
」戻ってきたがenumtypesの私の辞書には "MailDirectLinkContent
"がある。 これを避ける方法がある場合、または私の列挙型をアクションクラスから唯一の解決策として取り出す必要があるかどうか、私の質問です。
更新2: @KeithSが彼のコメントで述べたように、私はクラスからEnumを取り除かなければなりませんでした。私はそれらをサブフォルダに入れて、まだグループ化されていますが、上記の方法はすべてのEnumでこのように動作します。
Thx Keith。
「利用可能なすべての列挙型の列挙型は、」ここに実行可能でしょうか? @Marc; –
;私はそれを示唆すると考えましたが、Enumが追加されたときには、複数の場所でコードを変更する必要があります(したがって、実行する必要があることを知る必要があります)。それが大きな問題であるかどうかは、問題の範囲を超えてさまざまなことに依存します。実際に@KeithS; – KeithS
;それは完全に実行不可能/不適切かもしれません - したがって、コメント(質問)は答えではありません; p –