6

快速提问,是否可以在所有枚举类型上默认启用 EnumPassthru?目前,我必须手动在每个枚举类型上启用此功能,或使用以下方法将其自动应用于我的 DTO 程序集类型:

    public static void ConfigureEnumTypes(RuntimeTypeModel tm, Assembly a)
    {
        foreach (var type in a.GetTypes())
        {
            if (type.IsEnum && type.GetCustomAttribute<ProtoContractAttribute>() != null)
                tm[type].EnumPassthru = true;
        }
    }

如果有更好的方法,我想知道。谢谢。

4

1 回答 1

5

这将在下一个构建中传递:

[TestFixture]
public class SO17245073
{
    [Test]
    public void Exec()
    {
        var model = TypeModel.Create();
        Assert.IsFalse(model[typeof(A)].EnumPassthru, "A");
        Assert.IsTrue(model[typeof(B)].EnumPassthru, "B");

        Assert.IsFalse(model[typeof(C)].EnumPassthru, "C");
        Assert.IsTrue(model[typeof(D)].EnumPassthru, "D");

        Assert.IsTrue(model[typeof(E)].EnumPassthru, "E");
        Assert.IsTrue(model[typeof(F)].EnumPassthru, "F");

        Assert.IsFalse(model[typeof(G)].EnumPassthru, "G");
        Assert.IsFalse(model[typeof(H)].EnumPassthru, "H");            
    }

    // no ProtoContract; with [Flags] is pass-thru, else not
    public enum A { X, Y, Z }
    [Flags]
    public enum B { X, Y, Z }

    // basic ProtoContract; with [Flags] is pass-thru, else not
    [ProtoContract]
    public enum C { X, Y, Z }
    [ProtoContract, Flags]
    public enum D { X, Y, Z }

    // ProtoContract with explicit pass-thru enabled; always pass-thru
    [ProtoContract(EnumPassthru = true)]
    public enum E { X, Y, Z }
    [ProtoContract(EnumPassthru = true), Flags]
    public enum F { X, Y, Z }

    // ProtoContract with explicit pass-thru disabled; never pass-thru
    // (even if [Flags])
    [ProtoContract(EnumPassthru = false)]
    public enum G { X, Y, Z }
    [ProtoContract(EnumPassthru = false), Flags]
    public enum H { X, Y, Z }
}

从您的示例代码中:

if (type.IsEnum && type.GetCustomAttribute<ProtoContractAttribute>() != null)

听起来你应该做[ProtoContract]的就是[ProtoContract(EnumPassthru = true)]在你的enum声明中做这件事,因为你已经有了。

于 2013-06-27T07:15:59.153 回答