首页 > 解决方案 > 给定基本读取方法,如何读取自定义类的数据包?

问题描述

我已经为我的 tcp 服务实现了以字节为单位处理数据的写/读方法。但是,这些方法只能处理基本类型,例如

public void Write(float value) 
{
    // write floats to bytes
}

public float ReadFloat()
{
    // read bytes into floats
    ...
    return result;
}

每次我尝试转换自定义类时,我都必须为其创建一个自定义方法来读取/写入,例如

public class person
{
    int age;
    string name;
    // ... more types
}
public void Write(Person p)
{
    Write(p.age);
    Write(p.name);
    // write more types...
}

因此,我尝试实现一个通用方法来处理这种数据结构,这是我想出的用于读取的方法,它基本上尝试访问所有成员类型,并相应地调用函数。

public T Read<T>(Type type)
{
    Object value = new object();
    var handler = new Dictionary<Type, Action>()
    {
        { typeof(byte)  , () => { value = ReadByte(); } },
        { typeof(bool)  , () => { value = ReadBool(); } },
        { typeof(int)   , () => { int value = ReadInt(); Console.WriteLine(value.ToString()); } },
        { typeof(string), () => { value = ReadString(); } },
        { typeof(float) , () => { value = ReadFloat(); } },
        { typeof(long)  , () => { value = ReadLong(); } }
    };



    MemberInfo [] memberInfo = type.GetMembers();
    foreach(var member in memberInfo)
    {
        switch (member.MemberType)
        {
            // filters to focus on private/public field members
            case MemberTypes.Field:
                FieldInfo field = type.GetField(member.Name);
                handler[field.FieldType]();
                Console.WriteLine($"{value.ToString()}");;
                break;


            // others like constructors, ignored
            default:
                break;
        }
    }

    // code that converts into type T?
    T result = new T();
    return result;

}

目标是让这个Read方法接受一个类类型,一个一个地获取其成员的类型,根据每个类型调用基本的read方法将字节转换为每个类型,并使用这些数据创建该类的一个实例并返回它.

本质上问题是,我想根据输入类 Type 参数返回一个类实例,但我不知道如何使用从基本读取方法返回的数据来创建这样一个类实例以在最后返回。我正在寻找一个实用的解决方案,因为这为我的项目节省了很多精力,但感谢任何帮助!

标签: c#system.reflection

解决方案


推荐阅读