c# - 使用反射在结构和类之间复制等效属性

标签 c# reflection

我正在制作游戏(有关上下文,请参阅 http://haighshroom.blogspot.com)并使用 XML 文件保存/加载游戏。它目前对每个类的保存格式使用不同的结构,但是继续更新保存文件结构证明很烦人,所以我想尝试采用以下通用方法。

假设我有 3 个类,它们都继承自 BaseClass:

Class1,它有 Property1,Property2(假设所有属性都是整数)

Class2,它有Property2,Property3

Class3,其中有Property1,Property3

现在我的新通用 SaveStruct 看起来像这样:

public struct EntityStruct
{
    public string ClassName;
    public int Property1;
    public int Property2;
    public int Property3;
    public EntityStruct()
    {
        ClassName = "";
        Property1 = Property2 = Property3 = 0;
    }
}

当保存/加载特定实体时,我想实现以下伪代码(两个函数都从 BaseClass 调用):

public EntityStruct GetSaveStruct()
{
    EntityStruct es = new EntityStruct();
    es.ClassName = this.GetType().Name;
    if Exists(this.Property1) es.Property1 = Get(this.Property1);
    if Exists(this.Property2) es.Property2 = Get(this.Property2);
    if Exists(this.Property3) es.Property3 = Get(this.Property3);
}
public void LoadFromStruct(EntityStruct es)
{
    BaseClass e = (BaseClass)(Activator.CreateInstance(null, GV.NameSpace + es.ClassName).Unwrap());
    if Exists(e.Property1) Set(e.Property1 = es.Property1);
    if Exists(e.Property2) Set(e.Property2 = es.Property2);
    if Exists(e.Property3) Set(e.Property3 = es.Property3);
}

我不知道如何定义的部分是:

-Exists(e.Property1) - 这需要使用反射来确定实例 e 是否定义了 Property1(我们从 BaseClass 调用它,所以如果不使用反射我们不知道)。

-Get(e.Property1) - 如果实例 e 确实存在属性 1,我们需要获取它的值

-Set(e.Property1 = es.Property1) - 如果实例 e 确实存在属性 1,我们需要设置它的值

非常感谢。

最佳答案

你可以试试这个代码

public void ShallowCopyValues<T1, T2>(T1 firstObject, T2 secondObject)
{
    const BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
    var firstFieldDefinitions = firstObject.GetType().GetFields(bindingFlags);
    IEnumerable<FieldInfo> secondFieldDefinitions =     secondObject.GetType().GetFields(bindingFlags);

    foreach (var fieldDefinition in firstFieldDefinitions)
    {
        var matchingFieldDefinition = secondFieldDefinitions.FirstOrDefault(fd => fd.Name == fieldDefinition.Name &&
                                                                                  fd.FieldType == fieldDefinition.FieldType);
    if (matchingFieldDefinition == null)
        continue;

        var value = fieldDefinition.GetValue(firstObject);
        matchingFieldDefinition.SetValue(secondObject, value);
    }
}

关于c# - 使用反射在结构和类之间复制等效属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20868352/

相关文章:

c# - DateTime.ParseExact 具有 7 位数字/一位或两位数字的月份

c# - Skip and Take 不适用于 IQueryable 数据源

c# - WinForms 应用程序中的初始化代码 - Program.cs 或 MainForm?

java - 我可以反射性地实例化 java 中的泛型类型吗?

c# - 查找对象的所有属性和子属性

c# - WinForms 表单卡住

c# - NHibernate Query<> 与 QueryOver<> 之间有什么区别?

java - 如何获取该类中某个字段的字段值

java - 传递类型 Class 的实例而不是 Class 表示的类

java - 在java中使用反射动态实例化类失败