假设我们有一个简单的类模型,其类为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吗?
最佳答案
您可以尝试使用TypeConverterAttribut
和PropertyDescriptor
更改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/