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 に答える