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