首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# -在复杂的类层次结构中查找具有特定名称的属性的所有对象

C# -在复杂的类层次结构中查找具有特定名称的属性的所有对象
EN

Stack Overflow用户
提问于 2016-02-18 15:55:16
回答 2查看 1.9K关注 0票数 1

我有一个复杂的类层次: B类是A类的属性,List(C类)和D类是B类的属性,等等--很多级别的父子关系。层次结构中的某些类具有字符串属性"foobar“。有些类没有。我有一个A类的实例化。我需要在层次结构中找到具有属性"foobar“的所有对象,并将其值更改为"qwerty”。在C#中有什么简单的方法可以做到这一点吗?

代码语言:javascript
复制
public class ClassD
{
    public string fooBar;
}
public class ClassC 
{ }
public class ClassB
{
    public List<ClassC> classCList;
    public ClassD classDInstance;
    public string fooBar;
}
public class ClassA
{
    public ClassB classBInstance;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-18 16:45:39

看起来,您希望用给定的名称更改属性的值。

这很难看,但可能会让您知道如何使用反射完成您想要的任务:

代码语言:javascript
复制
static void Set<T>(dynamic obj, string property, T value) {
    //Iterate through the fields on your object.  Can change this to properties or do both.
    foreach (var field in obj.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance)) {
        var fieldValue = field.GetValue(obj);

        //If we have a collection, then iterate through its elements.
        if (field.FieldType.GetInterface("System.Collections.IEnumerable") != null && !(fieldValue is string) && fieldValue != null)
            foreach (var item in fieldValue) SetField<T>(item, property, value);
        //If field name and type matches, then set.  
        else if (field.Name == property && field.FieldType == typeof(T)) field.SetValue(obj, value);
    }
}

你可以这样称呼它:

代码语言:javascript
复制
Set(obj, "fooBar", "qwerty");

请注意,这目前只在字段中迭代,因为这是设置类的方式(公共字段,而不是属性)。如果希望包含属性,可以将其更改为使用属性,或将字段和属性组合起来,并在两者都有中进行迭代。

再说一遍,我不是说要使用这种方法,但可能会给你一些想法。

票数 2
EN

Stack Overflow用户

发布于 2016-02-18 16:56:16

你可以使用反射,虽然我不是这样的球迷,我想这是最简单的方式来满足你的需要。

下面的代码不是很漂亮,但希望能给您一个想法。

代码语言:javascript
复制
    private static void replaceFoobar(object obj)
    {
        if (obj == null)
            return;

        const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.GetProperty | BindingFlags.Instance;
        FieldInfo[] members = obj.GetType().GetFields(bindingFlags);

        if (!members.Any())
            return;

        foreach (var item in members)
        {
            if (item.Name == "fooBar" || item.Name == "<fooBar>k__BackingField")
            {
                item.SetValue(obj, "qwerty");
            }
            else
            {
                object value = item.GetValue(obj);

                if (value != null && value is IEnumerable)
                {
                    foreach (var itemE in ((IEnumerable)value))
                        replaceFoobar(itemE);
                }
                else
                    replaceFoobar(value);
            }
        }
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35486226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档