C# 检查和调用重载方法的更简单方法

C# 检查和调用重载方法的更简单方法,c#,C#,在.NET3.5中,必须有一种更简单的方法,不?让SomeMethod成为类的成员方法是否合适 如果DerivedA、DerivedB等。。。所有对象共享同一父对象,然后可以在父类中将此方法创建为虚拟成员方法,并在继承自该方法的类中重写它。(这不是特定于.NET 3.5或任何其他.NET版本的,这只是OOP的基本功能之一) 像这样: private void SomeMethod(DerivedA something) {...} private void SomeMethod(DerivedB

在.NET3.5中,必须有一种更简单的方法,不?

让SomeMethod成为类的成员方法是否合适

如果DerivedA、DerivedB等。。。所有对象共享同一父对象,然后可以在父类中将此方法创建为虚拟成员方法,并在继承自该方法的类中重写它。(这不是特定于.NET 3.5或任何其他.NET版本的,这只是OOP的基本功能之一)

像这样:

private void SomeMethod(DerivedA something) {...}
private void SomeMethod(DerivedB something) {...}
private void SomeMethod(DerivedC something) {...}


BaseClass bc = somevariable;
if (bc is DerivedA) Somemethod(bc as DerivedA)
else if (bc is DerivedB) Somemethod(bc as DerivedB)
else if (bc is DerivedC) Somemethod(bc as DerivedC)
...
else if (bc is DerivedZZ) Somemethod(bc as DerivedZZ)

让SomeMethod成为类的成员方法是否合适

如果DerivedA、DerivedB等。。。所有对象共享同一父对象,然后可以在父类中将此方法创建为虚拟成员方法,并在继承自该方法的类中重写它。(这不是特定于.NET 3.5或任何其他.NET版本的,这只是OOP的基本功能之一)

像这样:

private void SomeMethod(DerivedA something) {...}
private void SomeMethod(DerivedB something) {...}
private void SomeMethod(DerivedC something) {...}


BaseClass bc = somevariable;
if (bc is DerivedA) Somemethod(bc as DerivedA)
else if (bc is DerivedB) Somemethod(bc as DerivedB)
else if (bc is DerivedC) Somemethod(bc as DerivedC)
...
else if (bc is DerivedZZ) Somemethod(bc as DerivedZZ)
然后你可以做:

public class BaseClass {
    public virtual void SomeMethod()
    {
    }
};

public class DerivedA : BaseClass {
    public override void someMethod()
    { //Do DerivedA things
    }
};
public class DerivedB : BaseClass {
    public override void someMethod()
    { //Do DerivedB things
    }
};
public class DerivedC : BaseClass {
    public override void someMethod()
    { //Do DerivedC things
    }
};

只要打电话:

BaseClass bc = new DerivedC();
即使BC类型是基类,如果实例化为派生类,也会调用派生方法。这意味着继承和多态性

此代码与您的代码相同

即使是您的,您也可以更好地使用typeof();)

然后你可以做:

public class BaseClass {
    public virtual void SomeMethod()
    {
    }
};

public class DerivedA : BaseClass {
    public override void someMethod()
    { //Do DerivedA things
    }
};
public class DerivedB : BaseClass {
    public override void someMethod()
    { //Do DerivedB things
    }
};
public class DerivedC : BaseClass {
    public override void someMethod()
    { //Do DerivedC things
    }
};

只要打电话:

BaseClass bc = new DerivedC();
即使BC类型是基类,如果实例化为派生类,也会调用派生方法。这意味着继承和多态性

此代码与您的代码相同


即使是您的,您也可以更好地使用typeof();)

听起来你需要重新思考一下自己是如何做事的;如果您有其他类需要使用此
基类
,在调用方法之前不知道它包含什么类型的派生类,那么这似乎效率低下

bc.SomeMethod();
在这种情况下,您的代码如下所示:

public abstract class BaseClass
{
     public abstract void InitializeAndDoOtherStuff();
}

public abstract class DerivedA
{
     public overload void InitializeAndDoOtherStuff()
     {
         // Initializes the control, pass whatever you need into this method, etc)
     }
}
 public class DerivedA : BaseClass, IControlA { }
 public class DerivedB : BaseClass, IControlB { }
 ...

从代码管理的角度来看,这是一个可怕的想法,但您可以这样做:

BaseClass bc = someVariable;
bc.InitializeAndDoOtherStuff();
然后,您的另一个类具有如下重载:

public abstract class BaseClass
{
     public abstract void InitializeAndDoOtherStuff();
}

public abstract class DerivedA
{
     public overload void InitializeAndDoOtherStuff()
     {
         // Initializes the control, pass whatever you need into this method, etc)
     }
}
 public class DerivedA : BaseClass, IControlA { }
 public class DerivedB : BaseClass, IControlB { }
 ...
然后,在您的代码中,它将非常简单:

 public void SomeMethod(IControlA control) { }
 public void SomeMethod(IControlB control) { }
 ...

重载解析可以解决这个问题,因为合适的接口只在一个派生类上

听起来你需要重新思考一下自己是如何做事的;如果您有其他类需要使用此
基类
,在调用方法之前不知道它包含什么类型的派生类,那么这似乎效率低下

bc.SomeMethod();
在这种情况下,您的代码如下所示:

public abstract class BaseClass
{
     public abstract void InitializeAndDoOtherStuff();
}

public abstract class DerivedA
{
     public overload void InitializeAndDoOtherStuff()
     {
         // Initializes the control, pass whatever you need into this method, etc)
     }
}
 public class DerivedA : BaseClass, IControlA { }
 public class DerivedB : BaseClass, IControlB { }
 ...

从代码管理的角度来看,这是一个可怕的想法,但您可以这样做:

BaseClass bc = someVariable;
bc.InitializeAndDoOtherStuff();
然后,您的另一个类具有如下重载:

public abstract class BaseClass
{
     public abstract void InitializeAndDoOtherStuff();
}

public abstract class DerivedA
{
     public overload void InitializeAndDoOtherStuff()
     {
         // Initializes the control, pass whatever you need into this method, etc)
     }
}
 public class DerivedA : BaseClass, IControlA { }
 public class DerivedB : BaseClass, IControlB { }
 ...
然后,在您的代码中,它将非常简单:

 public void SomeMethod(IControlA control) { }
 public void SomeMethod(IControlB control) { }
 ...

重载解析可以解决这个问题,因为合适的接口只在一个派生类上

我也会像前面提到的那样重新设计您的类,但是如果您不能这样做,您可以使用反射来完成这项工作

BaseClass bc = someVariable;
SomeMethod(bc);

如果SomeMethod不是公共实例方法,则需要相应地调整BindingFlags。

我也会像前面提到的那样重新设计类,但如果不能这样做,则可以使用反射来完成这项工作

BaseClass bc = someVariable;
SomeMethod(bc);

如果SomeMethod不是公共实例方法,您需要相应地调整BindingFlags。

是对象应该做的事情还是外力对对象做的事情?澄清一下,我使用的类不是DerivedX,而是作用于DerivedA。。。DerivedZ和调用方法来做不同的事情。基本上,我试图避免使用大型switch语句(或if/else),并决定使用某种方法(派生a)。我可以做一些MethodActionDriveDA,一些MethodActionDriveDB,等等。把它想象成一个包含各种用户控件的页面,这些用户控件有一个共享的基类,但需要单独填充和操作。可能是typeof()你能为你做这项工作吗?是
SomeMethod
对象应该做的事情,还是外力正在对对象做的事情?澄清一下,我正在使用的类不是DerivedX,而是作用于DerivedA。。。DerivedZ和调用方法来做不同的事情。基本上,我试图避免使用大型switch语句(或if/else),并决定使用某种方法(派生a)。我可以做一些MethodActionDriveDA、MethodActionDriveDB等。将其视为一个包含各种用户控件的页面,这些用户控件有一个共享基类,但需要单独填充和操作。也许typeof()可以为您完成这项工作?请参阅上面的注释。我使用的类不是派生类,而是作用于派生对象请参见上面的注释。我使用的类不是派生类,而是作用于派生对象请参见上面的注释。我使用的类不是派生类,而是作用于派生对象请参见上面的注释。我使用的类不是派生类,而是对派生对象进行操作。我无法重新设计其他人决定以他们选择的方式执行的类。基于我最初的问题,知道我不能更改其他人的代码,有什么办法可以让它变得更好吗?好吧,如果你不能更改现有代码,要么为现有代码编写自己的抽象层,要么这是你唯一的痛点,使用反射来保存自己的一些类型我无法重新设计其他人决定以他们选择的方式执行的类。基于我最初的问题,知道我不能更改其他人的代码,有什么办法可以让它变得更好吗?好吧,如果你不能更改现有代码,要么为现有代码编写自己的抽象层,或者如果这是你唯一的痛点,使用反射来节省一些输入