.net UITypeEditor和IExtenderProvider

.net UITypeEditor和IExtenderProvider,.net,winforms,design-time,uitypeeditor,iextenderprovider,.net,Winforms,Design Time,Uitypeeditor,Iextenderprovider,我有一个扩展程序(IExtenderProvider),它扩展某些类型的 具有其他属性的控件。对于其中一个属性,我有 编写了一个UITypeEditor。到目前为止,一切正常 扩展器本身也有一些属性,我正在尝试 用作UITypeEditor的某种默认设置。我想做的是成为 能够在扩展器本身(而不是扩展控件)上设置属性, 当我打开UITypeEditor以获取 作为扩展控件,我想在UITypeEditor中将一个值设置为 扩展程序上属性的 一个简单的例子:ExtenderProvider有一个属性D

我有一个扩展程序(IExtenderProvider),它扩展某些类型的 具有其他属性的控件。对于其中一个属性,我有 编写了一个UITypeEditor。到目前为止,一切正常

扩展器本身也有一些属性,我正在尝试 用作UITypeEditor的某种默认设置。我想做的是成为 能够在扩展器本身(而不是扩展控件)上设置属性, 当我打开UITypeEditor以获取 作为扩展控件,我想在UITypeEditor中将一个值设置为 扩展程序上属性的

一个简单的例子:ExtenderProvider有一个属性DefaultExtendedValue。在表单上,我将此属性的值设置为“我的值”。扩展控件通过提供程序具有带有UITypeEditor的属性ExtendedValue。当我打开属性ExtendedValue的编辑器时,默认(初始)值应设置为“我的值”

在我看来,最好的办法是 UITypeEditor.EditValue,就在调用之前 IWindowsFormsEditorService.DropDownControl或.ShowDialog

唯一的问题是我无法(或者我还没有发现如何)抓住 在EditValue中读取扩展程序提供程序本身的值,以读取相关属性的值并在UITypeEditor中进行设置。上下文给了我扩展的 控制,但在这种情况下这对我没用

有什么办法可以达到我的目的吗?感谢您的帮助

谢谢 汤姆



@桑贾德森:这不是个坏主意,但不幸的是,这并不能让我达到目的。我真的希望能够为扩展程序提供程序的每个实例分别设置这个默认值。(我可能在一个表单上有多个扩展控件,不同的扩展控件组具有不同的值。)

您是否考虑将DefaultValue添加为ExtenderProvider的静态属性,然后您可以访问它而不需要提供程序的实例?

您自己可以读取该属性吗

DefaultValueAttribute att = context.
    PropertyDescriptor.Attributes.
    OfType<DefaultValueAttribute>().
    FirstOrDefault();
object myDefault = null;
if ( att != null )
    myDefault = att.Value;
DefaultValueAttribute att=context。
PropertyDescriptor.Attributes。
OfType()。
FirstOrDefault();
对象myDefault=null;
如果(att!=null)
myDefault=附件值;
我已经使用Linq简化了代码,但是您可以在.Net 1中执行类似的操作。您好,我发现:

基本上:

var Ctl = context.Instance as Control;

Type t = Type.GetType("System.ComponentModel.ExtendedPropertyDescriptor");
LocalizationProvider myProvider = GetValueOnPrivateMember(t, context.PropertyDescriptor, "provider") as MyOwnExtenderProvider;
神奇的是,myProvider获得了我的IExtenderProvider控制权

其中GetValueOnPrivateMember应通过以下方式实现:

static object GetValueOnPrivateMember(Type type, object dataobject, string fieldname)
        {
            BindingFlags getFieldBindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField;
            return type.InvokeMember(fieldname,
                getFieldBindingFlags,
                null,
                dataobject,
                null);
        }