您可以在运行时通过手动向 TypeDescriptor 注册类型元数据类型来设置它。
事情是这样的。
var type = typeof(Foo);
var metadataType = typeof(FooMetadata);
TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(type, metadataType), type);
为了在上下文中显示所有内容,这将在数据网格中显示一个带有标题“自定义栏”的列。
public class Foo
{
public string Bar { get; set; }
public string DontShowMe { get; set; }
}
public class FooMetadata
{
[DisplayName("Custom Bar")]
public string Bar { get; set; }
[Browsable(false)]
public string DontShowMe { get; set; }
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
var type = typeof(Foo);
var metadataType = typeof(FooMetadata);
TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(type, metadataType), type);
this.dataGridView1.DataSource = new List<Foo> { new Foo { Bar = "Foobar" } };
}
}
如果您想在旅途中切换元数据类型,这也是一种TypeDescriptor.RemoveProviderTransparent
选择,但请记住,设置/取消设置它适用于整个应用程序域,因此需要考虑线程。