c# - 通过 WCF 以某种方式获取枚举描述 "generically"

标签 c# wcf enums

我有一个枚举,每个成员都有一个 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/

相关文章:

c# - 使用枚举处理强类型

WCF、RESTful Web 服务和自定义身份验证

c# - 无法在 selenium webdriver c# 中双击

c# - 使用 UI 应用程序交互式读取和写入命令行

c# - Web 服务 header 身份验证

.net - 如何在传输级别压缩来自 WCF .NET 的 HTTP 请求?

wpf - 是否可以将 WPF Combobox.SelectedValue 绑定(bind)到多个 ObjectDataProvider?

Java:获取枚举的 ExceptionInInitializerError

c# - 在属性中指定允许的枚举值

C# 程序想要选择数据 <= 23 :59:59 but ends up selecting data with 00:00:00 timestamp as well