我有一个枚举,每个成员都有一个 DescriptionAttribute
。
由于我无法通过 WCF 发送此 DescriptionAttribute
(通过艰难的方式了解到这一点),我一直在尝试创建一种方法来向我发送带有描述的字典。
经过一番挣扎后,我在我的 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;
}
调用方法:
var myDict = GetEnumDescriptionsList(typeof (UserType).ToString());
当我在与方法相同的类中进行调用时,这工作正常,但是当我通过 WCF 进行调用时,我返回了 null。
调试后,我注意到字符串参数包含一个“不正确”的值。我的意思是客户端的 UserType.ToString()
与 WCF 服务中的命名空间不同。
阅读 this post解释了那个问题。
此刻我被困在这里:泛型是不可能的,将类型作为 Type
类型的参数发送是不可能的 ( see this post ),...
最后一个选择是为我拥有的每个枚举(目前为 9 个)编写一个方法,但我觉得还有比这更好的方法。
提前致谢。
更新: 使用@KeithS 提供的解决方案,我有以下代码来创建字典:
Assembly asm = Assembly.GetExecutingAssembly();
foreach (Type type in asm.GetTypes())
{
if (type.IsEnum)
{
enumTypeNames.Add(type.Name, type.AssemblyQualifiedName);
}
}
网络服务中的方法为给定类型的每个枚举成员返回一个字典:
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
”,但在我的枚举类型字典中有“MailDirectLinkContent
”。
所以我的问题是是否有办法避免这种情况,或者我是否必须将我的枚举作为唯一的解决方案从 Actions 类中取出。
更新 2: 正如@KeithS 在他的评论中提到的,我不得不将 Enums 从我的类(class)中移除。我已将它们放在一个子文件夹中,因此它们仍然“分组”,但上述方法确实适用于所有枚举。
谢谢基思。
最佳答案
如果您可以安全地假设命名空间不需要使枚举类型的名称唯一(换句话说,没有也不会有两个您要关心的名为“MyEnum”的枚举),您可以设置一个Dictionary<string,string>
键入“简单”(非限定)枚举类型名称,并包含服务器端每个枚举类型的完全限定名称。然后,您只需将简单的 Enum 类型名称传递给您的方法,并通过 Dictionary 运行它以生成您获取和返回值的“真实”类型名称,客户端和服务器之间的任何 namespace 差异都无关紧要。
字典甚至可以动态生成,因此它需要较少的维护,但是您可能会开始遇到扫描程序集的枚举类型的问题(如果只有一个程序集或 namespace 包含您关心的所有枚举,这会有所帮助) .
关于c# - 通过 WCF 以某种方式获取枚举描述 "generically",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6986383/