有没有一种方法可以在PropertyGrid中显示静态属性?

克里斯·格雷厄姆

我有一个PropertyGrid显示对象的所有实例属性。有没有办法同时显示对象所属类的静态属性,无论是相同的还是单独的PropertyGrid另外,还有另一个Forms控件可以让我执行此操作吗?

雷扎·阿盖伊(Reza Aghaei)

类型描述符负责提供要显示的属性列表PropertyGrid

要自定义属性列表,您需要使用以下任一选项为您的类/对象提供自定义类型描述:

在此示例中,我实现了最后一个选项。我假设您将使主类保持不变,并且仅出于显示的目的PropertyGrid,我创建了一个自定义包装器对象,该对象提供了属性网格的属性列表,包括静态属性。

假设您有一个这样的课程:

public class MyClass
{
    public string InstanceProperty { get; set; }
    public static string StaticProperty { get; set; } = "Test";
}

您想在中显示它的属性PropertyGrid

然后,通常您需要的第一件事是一个新的属性描述符:

using System;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
public class StaticPropertyDescriptor : PropertyDescriptor
{
    PropertyInfo p;
    Type owenrType;
    public StaticPropertyDescriptor(PropertyInfo pi, Type owenrType)
        : base(pi.Name,
              pi.GetCustomAttributes().Cast<Attribute>().ToArray())
    {
        p = pi;
        this.owenrType = owenrType;
    }
    public override bool CanResetValue(object c) => false;
    public override object GetValue(object c) => p.GetValue(null);
    public override void ResetValue(object c) { }
    public override void SetValue(object c, object v) => p.SetValue(null, v);
    public override bool ShouldSerializeValue(object c) => false;
    public override Type ComponentType { get { return owenrType; } }
    public override bool IsReadOnly { get { return !p.CanWrite; } }
    public override Type PropertyType { get { return p.PropertyType; } }
}

然后,您可以使用我上面提到的任何一个选项。例如,在这里我创建了一个包装器类型描述符,以不影响原始类:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
public class CustomObjectWrapper : CustomTypeDescriptor
{
    public object WrappedObject { get; private set; }
    private IEnumerable<PropertyDescriptor> staticProperties;
    public CustomObjectWrapper(object o)
        : base(TypeDescriptor.GetProvider(o).GetTypeDescriptor(o))
    {
        WrappedObject = o;
    }
    public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    {
        var instanceProperties = base.GetProperties(attributes)
            .Cast<PropertyDescriptor>();
        staticProperties = WrappedObject.GetType()
            .GetProperties(BindingFlags.Static | BindingFlags.Public)
            .Select(p => new StaticPropertyDescriptor(p, WrappedObject.GetType()));
        return new PropertyDescriptorCollection(
            instanceProperties.Union(staticProperties).ToArray());
    }
}

而且用法很容易:

var myClass = new MyClass();
propertyGrid1.SelectedObject = new CustomObjectWrapper (myClass);

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有一种方法可以在颤动中显示文本内部的图像

有没有一种方法可以检查数据属性是否存在?

有没有一种方法可以在Java中创建公共静态类?

有没有一种方法可以初始化静态字段?

有没有一种方法可以“提取” TypeScript接口属性的类型?

有没有一种方法可以显示在Shiny中构建的图,而不是等待所有图?

有没有一种方法可以在QTextEdit中显示堆叠的文本

有没有一种方法可以检查属性是否有设置器?

有没有一种方法可以在Excel中显示动态行数?

有没有一种方法可以直接从getter或setter访问属性的属性?

有没有一种方法可以在RStudio Viewer中显示多个表?

有没有一种方法可以模拟请求对象上的属性

有没有一种方法可以在Python中实现全局计算属性?

有没有一种方法可以获取具有set方法的属性?

在Python中,有没有一种方法可以找到具有特定属性的对象?

有没有一种方法可以指定类的默认属性?

有没有一种方法可以从msbuild中获取属性的值?

有没有一种方法可以在C ++中的枚举中存储静态指针地址

有没有一种方法可以在图形显示的工具提示中显示文本而不会重叠?

有没有一种方法可以设置属性的属性?

有没有一种方法可以在位置静态容器中获得绝对位置?

在ActiveAdmin中,有没有一种方法可以显示关联的nil模型?

在JavaFX中,有没有一种方法可以先显示Tab名称,然后显示图形?

有没有一种方法可以在目标描述中扩展ant属性?

有没有一种方法可以在接口上声明计算属性?

有没有一种方法可以确定哪个类在.NET中称为静态方法

有没有一种方法可以更改占位符以仅读取模型的显示名称属性?

有没有一种方法可以在多行中编写一个很长的HTML属性值?

有没有一种方法可以整体添加或删除属性?