Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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#_Extension Methods - Fatal编程技术网

几乎相同方法的C#扩展

几乎相同方法的C#扩展,c#,extension-methods,C#,Extension Methods,对C#还是有点新鲜,我有一个“实用工具”类,我想在多个内部项目中使用它。在一个项目中,有一个巨大的内部对象(SpecialObj)。其他项目无法访问此对象,将其添加到这些项目中是不可能的,因此基本方法不知道SpecialObj 这就是:MyClass方法(不使用这个特殊对象)和MyCube扩展(采取特殊对象)的My方法有几乎相同的代码,除了中间使用这个特殊对象的一个部分。< /P> public class MyClass{ public string MyMethod (string

对C#还是有点新鲜,我有一个“实用工具”类,我想在多个内部项目中使用它。在一个项目中,有一个巨大的内部对象(
SpecialObj
)。其他项目无法访问此对象,将其添加到这些项目中是不可能的,因此基本方法不知道
SpecialObj

这就是:MyClass方法(不使用这个特殊对象)和MyCube扩展(采取特殊对象)的My方法有几乎相同的代码,除了中间使用这个特殊对象的一个部分。< /P>

public class MyClass{
    public string MyMethod (string param1, Dictionary<string, string> param2){
        //some code in here part 1
        //some code in here part 2
    }
}

public class MyClassExtension : MyClass{
    public string MyMethod (string param1, Dictionary<string, string> param2, SpecialOjb param3)
    {
        //some code in here part 1
        //something with param3, my special object
        //some code in here part 2
    }
}
公共类MyClass{
公共字符串MyMethod(字符串参数1,字典参数2){
//这里有一些代码,第1部分
//第2部分中的一些代码
}
}
公共类MyClassExtension:MyClass{
公共字符串MyMethod(字符串参数1、字典参数2、SpecialOjb参数3)
{
//这里有一些代码,第1部分
//关于param3的东西,我的特殊对象
//第2部分中的一些代码
}
}

用两种方法维护90%相同的代码似乎。。。大错特错。对于这种情况有什么例子或标准吗

我可能会做这样的事情

 public class MyClass{
    public virtual string MyMethod (string param1, Dictionary<string, string> param2){
      int i= MyCommonCode.MyCommonMethod();
      //I do whatever I like with i here
    }
}

public class MyClassExtension : MyClass{
    public string MyMethod (string param1, Dictionary<string, string> param2, SpecialOjb param3)
    {
      int i= MyCommonCode.MyCommonMethod();
      //I do whatever I like with i here
    }
}

public class MyCommonCode
{
  public static int MyCommonMethod()
  {
    return 1;
  }
}
公共类MyClass{
公共虚拟字符串MyMethod(字符串参数1,字典参数2){
int i=MyCommonCode.MyCommonMethod();
//我在这里做我喜欢做的事
}
}
公共类MyClassExtension:MyClass{
公共字符串MyMethod(字符串参数1、字典参数2、SpecialOjb参数3)
{
int i=MyCommonCode.MyCommonMethod();
//我在这里做我喜欢做的事
}
}
公共类代码
{
公共静态方法()
{
返回1;
}
}

您可以将代码拆分为受保护的部分并调用它们

public class MyClass
{
    public string MyMethod (string param1, Dictionary<string, string> param2) 
    {
        ProtectedMyMethodPart1( ... );
        ProtectedMyMethodPart2( ... );
    }

    protected void ProtectedMyMethodPart1( ... )
    {
    }

    protected void ProtectedMyMethodPart2( ... )
    {
    }
}
公共类MyClass
{
公共字符串MyMethod(字符串参数1,字典参数2)
{
受保护的方法第1部分(…);
受保护的方法第2部分(…);
}
受保护的无效受保护的方法第1部分(…)
{
}
受保护的无效受保护的方法第2部分(…)
{
}
}
并在继承的类中重用它们

public class MyClassExtension : MyClass
{
    public string MyMethod (string param1, Dictionary<string, string> param2, SpecialOjb param3)
    {
        ProtectedMyMethodPart1( ... );
        // Do something with param3
        ProtectedMyMethodPart2( ... );
    }
}
公共类MyClassExtension:MyClass
{
公共字符串MyMethod(字符串参数1、字典参数2、SpecialOjb参数3)
{
受保护的方法第1部分(…);
//对param3做点什么
受保护的方法第2部分(…);
}
}

你能用另外两种方法得到
这里的一些代码第1部分和
这里的一些代码第2部分吗?
MyClass::MyMethod
能调用
MyClassExtension::MyMethod
?@DanDumitru这是一个非常非常好的想法。。。也许,我会试试。能否将
speciallobj
简化为一个可以作为
MyClass.MyMethod
的可选参数的接口?i、 e.
param2,ISpecialObj param3=null)
/*第1部分中的一些代码*/param3?.DoYourThing();/*这里的一些代码第2部分*/
@Igor no,仅此相反