快速提问,默认情况下是否可以在所有枚举类型上启用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;
}
}
如果有更好的方法,我想知道。感谢。
答案 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
。