Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 很多函数都采用相同的参数?_C#_Design Patterns_Facade - Fatal编程技术网

C# 很多函数都采用相同的参数?

C# 很多函数都采用相同的参数?,c#,design-patterns,facade,C#,Design Patterns,Facade,如果这个问题有点不清楚,我很抱歉。请随意澄清/概括这个问题。我英语学得不够好,不能自己做 我需要使用一个web服务,web服务的所有方法都将身份验证对象作为第一个参数 class webservice{ e_webservice_return_value method1(object authentication,object param1,object param2,object param32) e_webservice_return_value method2(object

如果这个问题有点不清楚,我很抱歉。请随意澄清/概括这个问题。我英语学得不够好,不能自己做

我需要使用一个web服务,web服务的所有方法都将身份验证对象作为第一个参数

class webservice{
    e_webservice_return_value method1(object authentication,object param1,object param2,object param32)
    e_webservice_return_value method2(object authentication,object param1,object param2)
    .....
}
有数百种方法

我想创建一个提供所有方法的提供者类 现在我可以创建一个名为provider的类,并为每个方法编写代码

class provider{
    object _auth;
    e_webservice_return_value method1(object param1,object param2,object param3)
    {
        var res= method1(_auth,param1,param2,param3);
        if(res=bad auth)
        {
            ReAuth(auth);
        }
        return res;
    }

    e_webservice_return_value method2(object param1,object param2)
    {
        var res =return e_webservice_return_value method2(_auth,param1,param2);
        if(res=bad auth)
        {
            ReAuth(auth);
        }
        return res;
    }
}
我需要这种模式来处理所有数百种方法


有没有一种技术可以创建这样一个facade对象,而不用实际编写100个函数,所有函数都具有相同的功能?(只有第一个参数相同)其他参数可能不同

您可能希望使用
反射。发射
。一个不错的,但可能有点过时的教程,可以在。还可以看看MSDN-他们有很棒的文档

您通常希望做的是用属性标记每个方法(或整个类),并为每个这样的方法/类创建一个包装方法,并替换代码。您可以让它在应用程序初始化时运行,或者在第一次调用这个类/方法时运行,设计取决于您

这不是一项容易的任务,但实际上我们在项目中也遇到了同样的情况,这被证明是一个很好的解决方案。这是因为具有给定属性的每个方法都需要类似的处理

请记住,有一些替代方法可以实现代码发布,但我不太了解它们,因此我无法提供任何建议,但这很容易被谷歌搜索到


Reflection.Emit
单独使用IL是相当麻烦的,但它确实可以让你在引擎盖下更多地了解你的c#代码中正在发生的事情。

我理解这个想法,但从智能角度看,这可能会很可怕,不是吗?哦,是的,这是真的。不仅从Intelissense的角度来看,编译人员也不知道新方法。我的建议来自这样一个事实,即您正在构建一个web服务。我们的场景是:使用一个方法,即WCF端点(使用restful API),使用IL为该方法创建一个包装器,将该包装器视为一个新的enpoint。这样,我们就不会直接调用我们的方法,它们由框架调用,因为它们具有适当的WCF属性。还有其他可能的情况,有些更难,有些更容易;]您不应该只在身份验证工作时使用委托并调用该委托吗?