如何解决C#通用参数-是否有任何“可为空”约束
我经常使用泛型和 Expression
假设我们有这个对象:
class MyObject {
public int NeverNull { get; set; }
public int? CanBeNull { get; set; }
}
我希望能够做到这一点:
int? val1 = Foo(o => o.NeverNull);
int? val2 = Foo(o => o.CanBeNull);
我有2种解决方案:
// Solution 1: two overloads
// First overload: for the non-nullable properties
TValue? Foo<TValue>(Expression<Func<MyObject,TValue>> selector)
where TValue: struct
{ ... }
// Second overload: for the nullable properties
TValue? Foo<TValue>(Expression<Func<MyObject,TValue?>> selector)
where TValue: struct
{ ... }
和
// Solution 2: using object
TValue? Foo<TValue>(Expression<Func<MyObject,object>> selector)
where TValue: struct
{ ... }
第一个解决方案意味着加倍逻辑,即meh。 第二种解决方案暗含键入错误的问题和无用的装箱/拆箱。
是否存在第三种更清洁的解决方案,使其具有“可为空或不为空”的通用参数?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。