gpt4 book ai didi

c# - 使用约束重载通用扩展方法 - Func 模式

转载 作者:行者123 更新时间:2023-11-30 22:10:10 24 4
gpt4 key购买 nike

许多 GUI 框架都使用一种非常酷的模式来确保正确编码:

interface IBase1 {}
interface IBase2 {}

class Base1 : IBase1
{
public int x { get; set; }
}
class Base2 : IBase2
{
public int y { get; set; }
}

static class Helpers
{
public static void ToProp<T,Y> (this T obj, Func<T, Y> getter)
{
}
}

class Program
{
static void Main(string[] args)
{
var b1 = new Base1();
var b2 = new Base2();

b1.ToProp(b => b.x);
b2.ToProp(b => b.y);
}
}

这里的奇妙之处在于,当您键入 b => b.x 时,Visual Studio 将为您提供 IntelliSense,如果您尝试访问不正确的属性,编译器将会报错。我看到这在 MVVM 框架中经常使用。他们通常会将 b => b.x 作为表达式树并解析出参数的名称,以便正确引发通知属性更改消息。

我想扩展它,并用以下内容替换 ToProp 定义,基本上有两个代码路径,具体取决于基本接口(interface):

static class Helpers
{
public static void ToProp<T,Y> (this T obj, Func<T, Y> getter)
where T : IBase1
{
// Do something custom for 1
}

public static void ToProp<T, Y>(this T obj, Func<T, Y> getter)
where T : IBase2
{
// Do something custom for 2
}
}

这不会按原样编译 - 两个 ToProp 调用都因不明确的方法解析错误而失败。这是 SO 上的一个众所周知的问题 - 对象约束不是方法解析过程的一部分(例如,参见 Lipert 的 blog)。

但我不禁想知道是否有办法。例如,我尝试将 this T obj 替换为 this Base1 obj,但在那种情况下,您失去了 ide 对属性解析的支持,也可以编写 b1.ToProp(b => b.y)。我想这可能会被运行时异常捕获。我也尝试过隐式转换 - 但不幸的是,这不是方法解析过程的一部分。

这是因为我正在扩展 ReactiveUI 框架以与 Caliburn.Micro 一起工作。 ReactiveUI 有一个非常好的扩展方法 ToProperty,它采用 ReactiveUI ViewModel。通过稍作修改,我可以更改该代码以使用 Caliburn.Micro View 模型。但是,然后我遇到了上面模棱两可的方法问题。同时,我只是调用 Caliburn.Micro 方法 ToPropertyCM

任何人都知道我应该追求的聪明途径来制作这样的东西吗?并可扩展到新的基类类型?

已编辑 修复了示例以表明它是一个我感兴趣的简单界面。顺便说一句,我尝试了包装器方法 b.c。如果我理解方法解析,它应该允许您在解析过程中对模板参数的类型进行约束检查。但是,正如我提到的,隐式类型转换在解析期间不起作用。

最佳答案

只是不要使方法针对该类型具有通用性:

public static void ToProp<Y>(this Base1 obj, Func<Base1, Y> getter)
{
// Do something custom for 1
}

public static void ToProp<Y>(this Base2 obj, Func<Base2, Y> getter)
{
// Do something custom for 2
}

如果这些方法对于该类型是通用的很重要,那么您将需要以某种方式更改签名以解决歧义。最有效的方法是更改​​名称。如果行为针对这两种类型进行了个性化设置,那么它们在概念上做的事情至少略有不同,因此您应该能够在方法名称中反射(reflect)这一点。

关于c# - 使用约束重载通用扩展方法 - Func 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21029771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com