C#通用参数-是否有任何“可为空”约束

问题描述

我经常使用泛型和 Expression > 构建工具来定位对象的属性。 我一直在为C#的非常愚蠢的限制而苦苦挣扎(但也许我不知道适当的解决方案)。

假设我们有这个对象:

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 (将#修改为@)