默认启用 EnumPassthru

Posted

技术标签:

【中文标题】默认启用 EnumPassthru【英文标题】:Enabling EnumPassthru by default 【发布时间】:2013-06-21 22:09:07 【问题描述】:

快速提问,是否可以在所有枚举类型上?目前,我必须手动在每个枚举类型上启用此功能,或使用以下方法将其自动应用于我的 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;
        
    

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

【问题讨论】:

您的示例仅对那些标有该属性的枚举启用它 - 同一属性不能也将其声明为 enum-passthru? 作为 ProtoContract 属性的一个选项?我不认为我可以启用枚举通道,可以吗?如果是这样,那将是理想的,但我没有看到它的参数。 我可能记错了。我周末去看看。 抱歉唠叨,但你有没有碰巧发现什么?再次感谢。 我被一些无关的工作淹没了,需要在周一完成;早上会看 【参考方案1】:

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

[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)

听起来您需要做的就是在您的enum 声明中添加[ProtoContract],因为您已经拥有[ProtoContract]

【讨论】:

@Barguast 我还没有切换到我的构建 VM 进行正式构建 - 如果您希望我向您发送“在我的开发 PC 上构建”预发布构建,请告诉我 我想我很高兴等待下一个版本。再次感谢您的帮助并添加此功能。 嗨,马克,感谢您为此付出的努力!我还有几个简单的问题:1)我假设这仅在 protobuf-net v2 中更新,对吗? 2)这个选项可以应用于收藏吗?例如,我可以在 Dictionary 中获得直通行为吗? @AmberScouras 我不知道我是否有明确的测试,但MyEnum 的直通应该自动应用于Dictionary&lt;MyEnum,T&gt; 中的MyEnum @MarcGravell 有没有办法在另一个方向上做到这一点?我正在使用 ProtoGen 从 .proto 文件生成 C#。有没有办法从 .proto 或 VS 自定义工具选项打开 EnumPassthru?否则我必须对生成的 C# 进行后处理。 (就目前而言,我们的系统依赖于客户端应用程序升级来处理新的枚举值,所以理想情况下我想从 .proto 文件中驱动它。)如果将无法识别的枚举值应用到默认值不是更好吗在消息字段中指定?

以上是关于默认启用 EnumPassthru的主要内容,如果未能解决你的问题,请参考以下文章

默认启用 EnumPassthru

Xcode 默认启用文件访问

始终启用“使用严格”;默认?

默认情况下启用 UnsafeHeaderParsing 是不是可以接受?

默认情况下在我的 android 应用中启用所有通知设置

java安全管理器是不是可以在安装级别默认启用?