默认情况下启用EnumPassthru

时间:2013-06-21 22:09:08

标签: protobuf-net

快速提问,默认情况下是否可以在所有枚举类型上启用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;
        }
    }

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

1 个答案:

答案 0 :(得分: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

相关问题