2011-12-26 34 views
2

我试图构造一个接受方法指示的流畅式API。我想实现可以用这个(无效)代码样本来描述下:构建一个接受方法组的流畅API方法

public class SampleBuilder 
{ 
    public void Method<T>(Expression<Func<T, Delegate>> func) { } 
    // for the sake of this example this method doesn't have a return value 
} 

public class Sample 
{ 
    public void SomeMethod(int some, int arbitrary, int agruments) { } 
} 

public class SampleConfig 
{ 
    public void Config() 
    { 
     new SampleBuilder().Method<Sample>(x => x.SomeMethod); 
    } 
} 

的问题是编译器显然抱怨x.SomeMethod表示方法组。我的API既不能推定实际的实例,也不能推定实际的方法签名。这是在运行时决定的。

你会如何解决这种情况,以提供一个易于使用的API,让用户指定一个方法组?


背景:导致使用量将是这样的:

config.Transition().From(v1def, v1 => v1.ExitMethod).To(v2def, v2 => v2.EntryMethod); 

To()From()接受意见及其进入/退出方法定义。在上面的具体示例中,v1def表示视图定义类,而v1表示实际视图类。在一天结束时,构建新的转换并将其添加到config中。

回答

1

不幸的是,根本无法将方法组作为参数传递。据我所知,CLR(以及各种语言和它们之间的所有内容)不允许传递本质上是无类型委托的东西......并且由于方法重载,具有不同签名的多个委托的场景是用方法组名称表示必须考虑。

因为我不知道你的视图定义和视图实例类是如何构造或实现的细节,所以我能做的最好的是建议通过使用attributes来使用AOP。如果它适用于你的架构,我会强烈建议考虑它。你可以使用自定义属性修饰你的入口和出口方法,并在你的配置类中使用装饰。

如果您的架构不适合使用AOP进行增强,您唯一剩下的选择是使用弱写类型的解决方案,该解决方案在编写配置时使用字符串,以及在阅读这些字符串时进行大量反射背部。我知道它看起来不像.NET中的其他流利的API,但这真的很糟糕吗?

config.Transition().From(v1def, "ExitMethod").To(v2def, "EntryMethod"); 
0

的方法之一是增加

public void SomeMethod() { } 

在Sample类,并改变SampleBuilder.Method签名

public void Method<T>(Expression<Func<T, Action>> func) { } 

这样你就可以捕捉到需要的方法的名称(通过传递方法组转换为委托实例)并选择适当的重载。

相关问题