如何通过对象指针调用C#对象方法/更改字段?

如何通过对象指针调用C#对象方法/更改字段?,c#,C#,这里有一个简单的问题(这里是C#noob),我找不到怎么做(我有Schildt的C#4.0参考资料,但还不确定我在寻找什么) 假设我有两个由两个不同类创建的对象,但是有同名的字段和/或方法。例如: public class Object1 { bool enable; public void Reset(){ enable = false; } } public class Object2 { bool enable; public void Reset(){

这里有一个简单的问题(这里是C#noob),我找不到怎么做(我有Schildt的C#4.0参考资料,但还不确定我在寻找什么)

假设我有两个由两个不同类创建的对象,但是有同名的字段和/或方法。例如:

public class Object1 {
  bool enable;
  public void Reset(){
    enable = false;
  }
}

public class Object2 {
  bool enable;
  public void Reset(){
    enable = false;
  }
}
对象是非常不同的,因此有理由创建两个不同的对象。但是,我有许多对象具有公共的“enable”字段和“Reset()”方法

下面是我想做的事情(用伪代码或其他方式):

我该怎么做?我不知道如何创建一个可以指向来自不同类的对象的对象

谢谢



感谢所有的答案。我查看了接口,并将其理解为一个“别名”,但不知道它们有什么用处。

只需使用一个通用接口,该接口可以实现
Object1
Object2

public interface InterfaceA {
  bool Enable { get; set; }
  void Reset();
}

public class Object1 : InterfaceA {
  public bool Enable { get; set; }
  public void Reset(){
    Enable = false;
  }
}

public class Object2 : InterfaceA {
  public bool Enable { get; set; }
  public void Reset(){
    Enable = false;
  }
}

void Manipulate(InterfaceA pObj){
  pObj.Enable = true;
  pObj.Reset();
}

void Main(){
  Manipulate(obj1);
  Manipulate(obj2);
}

注意:我已经更改了公共自动属性的public属性,因为接口不能有数据成员,并且工作方式相同。此外,使用属性也是更好的做法…

您希望执行以下操作:

public interface IEnableable {
    bool Enable { get; set; }
}

public interface IResettable {
    void Reset();
}

public interface IEnableableAndResettable : IEnableable, IResettable { }
它所做的是抽象您希望能够在对象上执行的操作。然后,您可以让方法
操纵
eat符合此抽象的对象

public class Object1 : IEnableableAndResettable {
    public bool Enable { get; set; }
    public void Reset() {
        this.Enable = false;
    }
    // details
}

public class Object2 : IEnableableAndResettable {
    public bool Enable { get; set; }
    public void Reset() {
        this.Enable = false;
    }
    // details
}
然后:

您甚至可以考虑给出<代码> Objuts1<代码>和<代码> Objuts2>代码>一个共同的基础:

public class Enableable : IEnableableAndResettable {
    public bool Enable { get; set; }
    public void Reset() { this.Enable = false; }
}

public class Object1 : Enableable { }
public class Object2 : Enableable { }

这就是接口的用途:

public interface ICanResetAndEnable
{
    // Note: interfaces cannot have fields, only properties and methods.
    bool Enable { get; set; }
    void Reset();
}

public class Object1 : ICanResetAndEnable {
  bool Enable { get; set; }
  public void Reset(){
    Enable = false;
  }
}

public class Object2 : ICanResetAndEnable {
  bool Enable { get; set; }
  public void Reset(){
    Enable = false;
  }
}
然后定义
操作
方法以接受实现此接口的任何类型的参数:

void Manipulate(ICanResetAndEnable obj)
{
    // Do whatever.
}

假设您使用的是.NET4.0,您可以简单地将变量声明为动态变量,并使用后期绑定来访问该方法

dynamic myvar = GetTheObjectFromSomewhere();
myVar.Enable = true;
myVar.Reset();

我会为所有共享Reset()方法的对象创建一个接口或基类

接口:

public interface IResetable
{
    void Rest();
}

public class ClassA : IResetable
{
    bool Enable = true;
    public void Reset()
    {
      Enable = false;
    }
}

void Manipulate(IResetable obj){
    obj.Reset();
}
..或基本类:

public class BaseResetClass 
{
    internal bool Enable = true;
    public void Reset()
    {
      Enable = false;
    }
}

public class ClassA : BaseResetClass 
{

}
public class ClassB : BaseResetClass 
{

}


var ca = new ClassA();
ca.Reset();

var ca2 = new ClassB();
ca2.Reset();

无论你做什么,都要买一本新书。几乎任何一本书都比舒尔特好。他那可怕的名声是无与伦比的。例如,我推荐Essential C#4.0:感谢书中的提示。Schildt是我尝试的第二本书,但仍然有一些概念没有进入我的脑海。例如,我完全忽略了接口的要点。+1抵消了否决票。虽然我建议使用接口,但这是一个有效的解决方案。我确信这可能被滥用。但是如果使用得当,这是非常优雅和简单的,可以与现有的设计一起使用,而无需进行重大的重构。这是一个有趣的解决方案。我想到了这一点,但害怕运行时出错。编译器是否检查所有可能分配给“myvar”的对象,或者如果错误的对象进入其中,我是否必须捕获异常?如果对象instace与方法/属性签名不匹配,则需要捕获异常。尽管如此,在某些情况下(你可以控制通过的内容),这是一个相当优雅的解决方案。有点像RoR的“约定优先于配置”的概念,我喜欢接口的分离。谢谢你对这方面的见解!
public interface IResetable
{
    void Rest();
}

public class ClassA : IResetable
{
    bool Enable = true;
    public void Reset()
    {
      Enable = false;
    }
}

void Manipulate(IResetable obj){
    obj.Reset();
}
public class BaseResetClass 
{
    internal bool Enable = true;
    public void Reset()
    {
      Enable = false;
    }
}

public class ClassA : BaseResetClass 
{

}
public class ClassB : BaseResetClass 
{

}


var ca = new ClassA();
ca.Reset();

var ca2 = new ClassB();
ca2.Reset();