【问题标题】:C# method call delegationC# 方法调用委托
【发布时间】:2010-10-01 23:25:39
【问题描述】:

假设我有一个 DLL 程序集,其中包含一个具有两种方法的自动生成类:

public class AutoGeneratedClass
{
    public int DoSomething(bool forReal) { ??? }
    public void DoSomethingElse(string whatever) { ??? }
}

方法可以是任何东西,真的。以上只是一个说明。

我需要生成什么样的代码来代替 ???上面让它自动打包调用的参数并将它们发送到另一个类上的单个泛型方法,然后它会实际处理调用并返回结果?

public class GenericClass
{
    public ??? GenericHandler(???) { ??? }
}

我想我正在寻找与 LINQ 中的 Expression<Func<...>> 类似的东西,它编译成可以发送到任何地方并在那里拆开的数据结构。

不过,我希望保持原始方法原型与正常的本地实现方法相同,以保持 AutoGeneratedClass 的调用者不明智。

如果这无法实现,我有什么选择?

谢谢!

【问题讨论】:

  • 如果您正在生成代码,您真的需要包含表达式吗? ??? => return GenericClass.GenericHandler(forReal)
  • 我只生成 AutoGeneratedClass。 GenericClass 及其 GenericHandler() 方法是在与 AutoGeneratedClass 完全不同的程序集中手动编码的。所以恐怕这行不通。

标签: c# linq methods delegation


【解决方案1】:

你必须上课吗?使用接口生活会轻松很多——然后您可以使用System.Runtime.Remoting.Proxies.RealProxy 或者可能根据需要创建一个新类型。我相信Rhino.Mocks 是后者(使用库来完成繁重的工作) - 如果您可以使用接口,那么看看 Rhino.Mocks 是如何实现的可能是一个很好的起点。

【讨论】:

  • 这是一个非常有趣的想法!我将探索接口和代理可以做什么来帮助我。谢谢!
【解决方案2】:

我将在这里暗中尝试,因为我不确定您的所有限制是什么。这听起来像是 AutoGenerated 类的部分方法/部分类的好例子。 (注意我没有通过编译器运行得这么好,所以它可能需要一些清理。)

public partial class AutoGenerated
{
    public partial int ProcessDoSomething(bool forReal);
    public int DoSomething(bool forReal)
    {
        //some generated code against error conditions??
        return ProcessDoSomething(forReal)
    }

    .....
}

public partial class AutoGenerated
{
    public partial int ProcessDoSomething(bool forReal)
    {
        //call the generic handler...
    }
}

我将远离通用处理程序的类似 LINQ 的表达式部分,因为我仍在研究 grokking 表达式。然而,需要考虑的是,如果您采用类似 LINQ 的表达式路径,您的 GenericClass 维护起来有多难/容易?

我的经验是,相当多的开发人员不习惯代理和 Lamba 表达式。在查看使用表达式的代码时,他们会畏缩(字面意思)。

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多