从另一个对象/类型调用成员方法,就好像它们属于该对象/类型

时间:2018-12-23 01:11:57

标签: c#

BinaryReader类具有读取基本数据类型的各种方法。

我创建了复杂的对象,所有对象都有自己的Read(BinaryReader reader),可以从其构造函数中调用该对象,并根据读取的数据对其进行初始化。

这意味着我现在以两种方式之一阅读内容:

  • int整数= reader.ReadInt32();
  • ComplexObject object = new ComplexObject(reader);

我非常想只使用一种方法。第一个想法是将所有Read(BinaryReader reader)方法移动到我自己的BinaryReader扩展中,并以此方式使用。但是,由于我有很多这样的人,所以这将导致我并不需要的整体类。

第二个想法是为所有基本类型创建包装器,然后将所有代码转换为使用第二个选项,但这带来了我不愿处理的其他问题的全新集合,因此该想法不会也可以。

但是,有什么方法可以在BinaryReader中注册某些对象成员方法,以便它可以将其自身作为参数来调用它们? 还是做类似的事情会得到相同的结果?

语法必须与第一个示例中的语法相同(或对于任何类型都相同),因为这样做的主要目的是避免重复代码以解释两种读取方式。

1 个答案:

答案 0 :(得分:0)

编辑-抱歉,我误解了您在问什么。它们被称为"extension methods"

public static class MyComplexObjectReader{
    public static MyComplexObject ReadComplexObject(this BinaryReader br){
        var o = new MyComplexObject();
        o.Field1 = br.ReadString();
        return o;
    }
}

现在您应该可以拨打电话

var br = new BinaryReader();
ComplexObject obj = br.ReadComplexObject();

如果您尝试避免为每个复杂对象创建Read函数,则可以使用类似于this article的策略,并利用Reflection和/或DynamicMethod在运行时创建一个方法来调用BinaryReader.Read获取每个对象属性。

如果您希望能够将BinaryReader传递给每个对象,则可以为每个复杂对象实现一个接口。

interface IPopulateable{
    void Populate(BinaryReader);
}

class ComplexObject : IPopulateable{

    public int MyInteger {get;private set;}

    public Populate(BinaryReader br){
        MyInteger = br.ReadInt32();
    }
}

然后创建一个利用该界面的阅读器

class MyReader {
    public static T Read<T>(BinaryReader br) where T : IPopulateable, new(){
        T instance = new T();
        instance.Populate(br);
        return instance;
    }
}

并称呼它

ComplexObject myobject = MyReader.Read<ComplexObject>(br);