尝试使用xsd.exe生成xsd:schema时出错

时间:2010-11-01 16:06:54

标签: c# .net xsd.exe

我有自定义配置部分,我想使用xsd工具生成xsd方案,但是我收到以下错误:

Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Error: There was an error processing 'C:\Development\XXX Application Framewo
rk\XXX.AppFramework\bin\Debug\XXX.AppFramework.dll'.
- There was an error reflecting type 'XXX.AppFramework.Configuration.AppFr
ameworkEnvironmentConfiguration'.
- You must implement a default accessor on System.Configuration.ConfigurationL
ockCollection because it inherits from ICollection.

但是我没有在我的部分实现ICollection,它看起来像这样:

public class AppFrameworkEnvironmentConfiguration : ConfigurationElement
{
    [ConfigurationProperty("Name")]
    public string Name
    {
        get { return (string)this["Name"]; }
        set { this["Name"] = value; }
    }

    [ConfigurationProperty("Description")]
    public string Description
    {
        get { return (string)this["Description"]; }
        set { this["Description"] = value; }
    }

    [ConfigurationProperty("ApplicationName")]
    public string ApplicationName
    {
        get { return (string)this["ApplicationName"]; }
        set { this["ApplicationName"] = value; }
    }

    [ConfigurationProperty("DeploymentMode",DefaultValue=DeploymentMode.Local)]
    public DeploymentMode DeploymentMode
    {
        get { return (DeploymentMode)this["DeploymentMode"]; }
        set { this["DeploymentMode"] = value; }
    }


}

它看起来不像ConfigurationElement实现ICollection所以我不知道为什么我会收到此错误?

深入了解反射器以找出何时抛出此错误,我甚至更加困惑,首先我的小测试确实评估为假:

bool test = typeof(ICollection).IsAssignableFrom(typeof    (XXX.AppFramework.Configuration.AppFrameworkEnvironmentConfiguration));

在反射器中,我能找到它的唯一地方就是将该异常包含在这个精确测试中,我在System.Xml.Reflection.TypeScope.ImportTypeDesc中找到了它,看起来像这样:

else if (typeof(ICollection).IsAssignableFrom(type))
{
    root = TypeKind.Collection;
    elementType = GetCollectionElementType(type, (memberInfo == null) ? null : (memberInfo.DeclaringType.FullName + "." + memberInfo.Name));
    none |= GetConstructorFlags(type, ref exception);
}

然后

private static Type GetCollectionElementType(Type type, string memberInfo)
{
return GetDefaultIndexer(type, memberInfo).PropertyType;
}

调用

internal static PropertyInfo GetDefaultIndexer(Type type, string memberInfo)
{
if (typeof(IDictionary).IsAssignableFrom(type))
{
    if (memberInfo == null)
    {
        throw new NotSupportedException(Res.GetString("XmlUnsupportedIDictionary",     new     object[] { type.FullName }));
    }
    throw new NotSupportedException(Res.GetString("XmlUnsupportedIDictionaryDetails", new object[] { memberInfo, type.FullName }));
}
MemberInfo[] defaultMembers = type.GetDefaultMembers();
PropertyInfo info = null;
if ((defaultMembers != null) && (defaultMembers.Length > 0))
{
    for (Type type2 = type; type2 != null; type2 = type2.BaseType)
    {
        for (int i = 0; i < defaultMembers.Length; i++)
        {
            if (defaultMembers[i] is PropertyInfo)
            {
                PropertyInfo info2 = (PropertyInfo) defaultMembers[i];
                if ((info2.DeclaringType == type2) && info2.CanRead)
                {
                    ParameterInfo[] parameters = info2.GetGetMethod().GetParameters();
                    if ((parameters.Length == 1) && (parameters[0].ParameterType == typeof(int)))
                    {
                        info = info2;
                        break;
                    }
                }
            }
        }
        if (info != null)
        {
            break;
        }
    }
}
if (info == null)
{
    throw new InvalidOperationException(Res.GetString("XmlNoDefaultAccessors", new object[] { type.FullName })); **< HERE IS THE ERROR**
}
if (type.GetMethod("Add", new Type[] { info.PropertyType }) == null)
{
    throw new InvalidOperationException(Res.GetString("XmlNoAddMethod", new object[] { type.FullName, info.PropertyType, "ICollection" }));
}
return info;
}

我也尝试添加默认的无参数构造函数,没有什么不同;-( 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

你可以尝试添加一个默认的构造函数,我已经看到类似这样的问题,并且添加一个空的默认构造函数已经为我修复了这个问题。不知道为什么,但在某些时候有意义研究它。