许多 GUI 框架都使用一种非常酷的模式来确保代码正确:
这里的妙处在于,当你键入
我想扩展这个功能,并用以下内容替换ToProp定义,基本上有两个代码路径,取决于基接口:
这段代码无法编译 - 两个
但我不禁想知道是否有办法。例如,我尝试将
这是因为我正在扩展ReactiveUI框架以与Caliburn.Micro一起使用。 ReactiveUI有一个非常好的扩展方法ToProperty,它需要一个ReactiveUI ViewModel。通过轻微修改,我可以更改该代码以使用Caliburn.Micro视图模型。但是,然后我遇到了上述的模糊方法问题。与此同时,我只需调用Caliburn.Micro方法
有人知道我应该追求哪个聪明的途径,以使这样的事情起作用吗?并且可以扩展到新的基类类型吗?
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会给你提供智能感知,并且编译器会在你试图访问不正确的属性时发出警告。我经常在MVVM框架中看到这种用法。他们通常将b => b.x
作为表达式树,并解析出参数名称,以便正确地引发通知属性更改消息。我想扩展这个功能,并用以下内容替换ToProp定义,基本上有两个代码路径,取决于基接口:
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的博客)。但我不禁想知道是否有办法。例如,我尝试将
this T obj
替换为this Base1 obj
,但在这种情况下,您会失去ide对属性解析的支持,还可以编写b1.ToProp(b => b.y)
。我想这可能会被运行时异常捕获。我也尝试了隐式转换 - 但不幸的是,这不是方法解析过程的一部分。这是因为我正在扩展ReactiveUI框架以与Caliburn.Micro一起使用。 ReactiveUI有一个非常好的扩展方法ToProperty,它需要一个ReactiveUI ViewModel。通过轻微修改,我可以更改该代码以使用Caliburn.Micro视图模型。但是,然后我遇到了上述的模糊方法问题。与此同时,我只需调用Caliburn.Micro方法
ToPropertyCM
。有人知道我应该追求哪个聪明的途径,以使这样的事情起作用吗?并且可以扩展到新的基类类型吗?