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

时间:2011-01-03 20:24:59

标签: 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(){
    enable = false;
  }
}

对象非常不同,证明了创建两个不同对象的合理性。但是,我有许多具有公共'enable'字段和'Reset()'方法的对象。

所以这就是我想要做的事情(伪代码或其他任何内容):

void Manipulate(ref object pObj){
  (pObj).enable = true;
  (pObj).Reset();
}

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

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

谢谢!


感谢所有答案。我浏览了接口并将它们理解为“别名”,并且无法弄清楚它们的用处是什么。

5 个答案:

答案 0 :(得分:5)

这是接口的用途:

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;
  }
}

然后定义Manipulate方法以接受实现此接口的任何类型的参数:

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

答案 1 :(得分:1)

只需使用Object1Object2都实现的通用界面。

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);
}

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

答案 2 :(得分:1)

你想做这样的事情:

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

public interface IResettable {
    void Reset();
}

public interface IEnableableAndResettable : IEnableable, IResettable { }

这样做是抽象出您希望能够对对象执行的操作。然后,您可以使方法Manipulate吃掉符合此抽象的对象。

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
}

然后:

void Manipulate(IEnableableAndResettable enableableAndResettable){
    enableableAndResettable.Enable = true;
    enableableAndResettable.Reset();
}

您甚至可以考虑将Object1Object2作为共同基础:

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

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

答案 3 :(得分:1)

鉴于您使用的是.NET 4.0,您可以简单地将变量声明为动态,并使用后期绑定来访问该方法。

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

答案 4 :(得分:0)

我会为共享方法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();