BinaryReader类具有读取基本数据类型的各种方法。
我创建了复杂的对象,所有对象都有自己的Read(BinaryReader reader),可以从其构造函数中调用该对象,并根据读取的数据对其进行初始化。
这意味着我现在以两种方式之一阅读内容:
我非常想只使用一种方法。第一个想法是将所有Read(BinaryReader reader)方法移动到我自己的BinaryReader扩展中,并以此方式使用。但是,由于我有很多这样的人,所以这将导致我并不需要的整体类。
第二个想法是为所有基本类型创建包装器,然后将所有代码转换为使用第二个选项,但这带来了我不愿处理的其他问题的全新集合,因此该想法不会也可以。
但是,有什么方法可以在BinaryReader中注册某些对象成员方法,以便它可以将其自身作为参数来调用它们? 还是做类似的事情会得到相同的结果?
语法必须与第一个示例中的语法相同(或对于任何类型都相同),因为这样做的主要目的是避免重复代码以解释两种读取方式。
答案 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);