假设我们有一个简单的类模型,其类为feilds(内部编译,不可修改的Dll):

public class SubSubClassTest {
    public int Data { get; set; }
}

public class SubClassTest {
    public string InnerStr { get; set; }
    public int InnerInteger { get; set; }
    public SubSubClassTest InnerLoad { get; set; }

    public SubClassTest() {
        InnerLoad = new SubSubClassTest();
    }
}

public class Test {
    public string Str { get; set; }
    public int Integer { get; set; }

    public SubClassTest Load { get; set; }

    public Test() {
        Load = new SubClassTest();
    }
}


我们想使用PropertyGrid对其进行编辑。

public partial class ApplicationForm : Form {
    public ApplicationForm() {
        InitializeComponent();
        var test = new Test();
        propertyGrid.SelectedObject = test;
    }
}


而且我没有更改类的能力(因为我是从Dll那里获得的),并且在所有类的成员上都没有[TypeConverter(typeof(ExpandableObjectConverter))]属性,我会得到这样的印象:



来自我的命名空间类类型的成员是不可编辑的。

如果所有这样的成员都具有[TypeConverter(typeof(ExpandableObjectConverter))]属性,那么我将拥有另一张图片,一切都会好起来的:



我想知道如何让PropertyGrid对所有嵌套类使用PropertyGrid吗?

最佳答案

您可以尝试使用TypeConverterAttributPropertyDescriptor更改Reflection e值。我不建议这样做,但是为了表明可能,我添加了示例代码。我已通过您的示例进行了验证,并且可以正常工作。但是我不能保证它会在所有情况下都适用。令人回味的食物...

var test = new Test();
SetTypeConverterAttribute(test);
propertyGrid.SelectedObject = test;

private void SetTypeConverterAttribute(Test test)
    {
        foreach (PropertyDescriptor item in TypeDescriptor.GetProperties(test))
        {
            TypeConverterAttribute attribute = item.Attributes[typeof(TypeConverterAttribute)] as TypeConverterAttribute;
            if (attribute != null && item.PropertyType == typeof(SubClassTest))
            {
                FieldInfo field = attribute.GetType().GetField("typeName", BindingFlags.NonPublic | BindingFlags.Instance);
                if (field != null)
                {
                    field.SetValue(attribute, typeof(ExpandableObjectConverter).FullName);
                }
            }
        }
    }

关于c# - 如何允许PropertyGrid中的嵌套类实例修改无法访问已检查的类代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21516202/

10-11 12:23