【问题标题】:Constructor not found for String未找到 String 的构造函数
【发布时间】:2015-05-28 16:49:20
【问题描述】:

如果我在包含List<string[]>Dictionary<string,string[]>(使用GenericDictionaryEditor)的属性网格中有一个对象,当我单击属性旁边的详细信息并单击添加时,会弹出一条消息说没有构造函数可以找到(对于列表)或找不到无参数构造函数(对于字典)。我真的不懂编辑器或属性网格,如果有任何帮助,我们将不胜感激。

[DataMember(Name="FolderPaths")]
[ReadOnly(false)]
[Description("List of folder paths")]
[Editor(typeof(Wexman.Design.GenericDictionaryEditor<string, string[]>), typeof(UITypeEditor))]
[Wexman.Design.GenericDictionaryEditor(Title="Folder Paths")]
public Dictionary<string, string[]> FolderPaths { get; set; }

这个说没有为 System.string[] 找到构造函数。

[DataMember(Name="FolderPaths")]
[ReadOnly(false)]
[Description("List of folder paths")]
public List<string[]> FolderPaths { get; set; }

【问题讨论】:

  • 为什么你有一个用于路径的字符串数组列表?看起来简单的List&lt;string&gt; 会起作用。文件夹路径是否有多个路径或其他东西?我假设您收到错误的原因是因为 string[] 没有像 string[] x = new string[]() 这样的构造函数...
  • 这也是我的猜测。是的,一个路径会有多个路径。
  • 可能必须创建一个自定义类型,例如 FolderPath 类型,它可以具有默认构造函数,然后使用 get/set 访问器设置路径。

标签: c# arrays propertygrid


【解决方案1】:

一种解决方案是为string[] 类型注册一个TypeDescriptionProvider。这是示例代码(您需要在程序开始时注册它,然后再显示任何属性网格):

...
TypeDescriptor.AddProvider(new StringArrayDescriptionProvider(), typeof(string[]));
...

这里是StringArrayDescriptionProvider 代码:

public class StringArrayDescriptionProvider : TypeDescriptionProvider
{
    private static TypeDescriptionProvider _baseProvider;

    static StringArrayDescriptionProvider()
    {
       // get default metadata
        _baseProvider = TypeDescriptor.GetProvider(typeof(string[]));
    }

    public override object CreateInstance(IServiceProvider provider, Type objectType, Type[] argTypes, object[] args)
    {
        // this is were we define create the instance
        // NB: .NET could do this IMHO...
        return Array.CreateInstance(typeof(string), 0);
    }

    public override IDictionary GetCache(object instance)
    {
        return _baseProvider.GetCache(instance);
    }

    public override ICustomTypeDescriptor GetExtendedTypeDescriptor(object instance)
    {
        return _baseProvider.GetExtendedTypeDescriptor(instance);
    }

    public override string GetFullComponentName(object component)
    {
        return _baseProvider.GetFullComponentName(component);
    }

    public override Type GetReflectionType(Type objectType, object instance)
    {
        return _baseProvider.GetReflectionType(objectType, instance);
    }

    public override Type GetRuntimeType(Type reflectionType)
    {
        return _baseProvider.GetRuntimeType(reflectionType);
    }

    public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
    {
        return _baseProvider.GetTypeDescriptor(objectType, instance);
    }

    public override bool IsSupportedType(Type type)
    {
        return _baseProvider.IsSupportedType(type);
    }
}

这是它的外观:

【讨论】:

  • 事件更好,你可以为任何数组类型修改它。 objectType.GetElementType()。你不能这样做 TypeDescripter.AddProvider( ... , typeof(Array)); 因为由于某种原因这会导致 StackOverflow 异常。
  • 是的,我想过,但最终的“字符串集合编辑器”只存在于字符串类型,所以它不是那么有用。另外我不喜欢调整整个系统的想法 - 副作用:-)
  • 哦,哈。我不认为我测试了字符串集合编辑器。 :D
猜你喜欢
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
相关资源
最近更新 更多