gpt4 book ai didi

c# - FieldInfo 更新字段的子字段

转载 作者:太空狗 更新时间:2023-10-29 21:56:38 25 4
gpt4 key购买 nike

你好,

我需要创建一个函数来迭代存储变量名和变量新值的字典。之后,我需要用该值更新类变量。

void UpdateValues(Type type, Dictionary<string, string> values)
{
foreach (var value in values)
{
var fieldInfo = selected.GetComponent(type).GetType().GetField(value.Key);
if (fieldInfo == null) continue;

fieldInfo.SetValue(selected.GetComponent(type), value.Value);
}
}

它有效,但我想要的改进很少,我绝对不知道这是否可能。如您所见,该函数可以接受任何类,而不仅仅是一个特定的类。

如果我有这样的课

class test
{
public string age;
}

我会以这种方式使用函数,它会起作用。

UpdateValues(typeof(test), new Dictionary<string, string>{{"age", "17"}});

问题是如果我有这样的类并且我想更新“子字段”(字段中的字段)

class test
{
public string age;
}

class test2
{
public test data;
}

我在想语法可以是这样的,但我不知道我该怎么做。

UpdateValues(typeof(test2), new Dictionary<string, string>{{"data.age", "17"}});

总而言之,我需要创建一个函数来获取存储在另一个类中的类。函数将遍历字典并更新类的字段甚至她的子字段。

最佳答案

我建议向您的方法添加一个递归调用,以设置属性。我稍微改变了你的方法,因为我没有 selected对象,它以一个对象作为参数

void UpdateValues<T>(T obj,  Dictionary<string, string> values)
{
foreach (var value in values)
{
SetProperty(obj, value.Key, value.Value);
}
}


public void SetProperty<T>( T obj, string valueKey, string value, Type type= null)
{
var typeToUse = type ?? typeof(T);
var pointIndex = valueKey.IndexOf(".");
if (pointIndex!=-1)
{
var subKey = valueKey.Substring(0, pointIndex);
var fieldInfo = typeToUse.GetField(subKey);
var propObj = fieldInfo.GetValue(obj)
?? Activator.CreateInstance(fieldInfo.FieldType);
SetProperty(propObj, valueKey.Substring(pointIndex+1), value, fieldInfo.FieldType);
fieldInfo.SetValue(obj, propObj);
}
else
{
var fieldInfo = typeToUse.GetField(valueKey);
if (fieldInfo != null)
fieldInfo.SetValue(obj, value);
}
}

即使你定义它也能工作

class test3
{
public test2 data;
}

然后打电话

UpdateValues(t, new Dictionary<string, string>{{"age", "17"}}); 
UpdateValues(t2, new Dictionary<string, string> { { "data.age", "17" } });
UpdateValues(t3, new Dictionary<string, string> { { "data.data.age", "17" } });

SetProperty的第三个参数方法不是很好,我会避免它,但我不知道如何用泛型解决它,在用 Activator 创建后你得到 object作为类型,对象没有字段 age

您正在使用 Dictionary<string, string>作为允许您仅设置字符串字段的参数,因此您必须假设您没有任何其他字段。实际上,即使您将使用 Dictionary<string, object>,这也会起作用,我建议这样做。

关于c# - FieldInfo 更新字段的子字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41298458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com