首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取自定义配置部分时出错:未为此对象定义无参数构造函数

读取自定义配置部分时出错:未为此对象定义无参数构造函数
EN

Stack Overflow用户
提问于 2012-03-13 16:12:02
回答 2查看 1.6K关注 0票数 3

从web.config读取自定义配置部分的时间很长:我正在使用配置节设计器(,http://csd.codeplex.com/)。

更新:

下面是我遇到的错误:

System.Configuration.ConfigurationErrorsException:发生错误,为SendToTestConfig/sendToTestIndexConfig创建配置节处理程序:没有为该对象定义无参数构造函数。(C:\TFS\Mainline\Business.Utility.SendToTest\Business.Utility.SendToTest\web.config第20行)-> System.MissingMethodException:没有为该对象定义的无参数构造函数。在System.RuntimeTypeHandle.CreateInstance(RuntimeType类型下,布尔publicOnly、布尔noCheck、布尔& canBeCached、RuntimeMethodHandle& ctor、布尔&bNeedSecurityCheck在System.RuntimeType.CreateInstanceSlow(布尔publicOnly,布尔fillCache)的System.RuntimeType.CreateInstanceImpl(布尔publicOnly、布尔skipVisibilityChecks、布尔fillCache)

以下是我的自动生成的配置部分:

代码语言:javascript
复制
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.225
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Business.Utility.SendToTest.Configuration
{


    /// <summary>
    /// The SendToTestIndexConfig Configuration Section.
    /// </summary>
    public partial class SendToTestIndexConfig : global::System.Configuration.ConfigurationSection
    {


        #region Singleton Instance
        /// <summary>
        /// The XML name of the SendToTestIndexConfig Configuration Section.
        /// </summary>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        internal const string SendToTestIndexConfigSectionName = "sendToTestIndexConfig";

        /// <summary>
        /// Gets the SendToTestIndexConfig instance.
        /// </summary>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        public static global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig Instance
        {
            get
            {
                return ((global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig)(global::System.Configuration.ConfigurationManager.GetSection(global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig.SendToTestIndexConfigSectionName)));
            }
        }
        #endregion

        #region Xmlns Property
        /// <summary>
        /// The XML name of the <see cref="Xmlns"/> property.
        /// </summary>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        internal const string XmlnsPropertyName = "xmlns";

        /// <summary>
        /// Gets the XML namespace of this Configuration Section.
        /// </summary>
        /// <remarks>
        /// This property makes sure that if the configuration file contains the XML namespace,
        /// the parser doesn't throw an exception because it encounters the unknown "xmlns" attribute.
        /// </remarks>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        [global::System.Configuration.ConfigurationPropertyAttribute(global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig.XmlnsPropertyName, IsRequired=false, IsKey=false, IsDefaultCollection=false)]
        public string Xmlns
        {
            get
            {
                return ((string)(base[global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig.XmlnsPropertyName]));
            }
        }
        #endregion

        #region IsReadOnly override
        /// <summary>
        /// Gets a value indicating whether the element is read-only.
        /// </summary>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        public override bool IsReadOnly()
        {
            return false;
        }
        #endregion

        #region appGroups Property
        /// <summary>
        /// The XML name of the <see cref="appGroups"/> property.
        /// </summary>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        internal const string appGroupsPropertyName = "appGroups";

        /// <summary>
        /// Gets or sets the appGroups.
        /// </summary>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        [global::System.ComponentModel.DescriptionAttribute("The appGroups.")]
        [global::System.Configuration.ConfigurationPropertyAttribute(global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig.appGroupsPropertyName, IsRequired=true, IsKey=false, IsDefaultCollection=false)]
        public global::Business.Utility.SendToTest.Configuration.AppGroupSettingsCollection appGroups
        {
            get
            {
                return ((global::Business.Utility.SendToTest.Configuration.AppGroupSettingsCollection)(base[global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig.appGroupsPropertyName]));
            }
            set
            {
                base[global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig.appGroupsPropertyName] = value;
            }
        }
        #endregion
    }
}
namespace Business.Utility.SendToTest.Configuration
{
   ... 

下面是我的配置文件:

代码语言:javascript
复制
<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="SendToTestConfig" type="System.Configuration.ConfigurationSectionGroup, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
      <section name="sendToTestIndexConfig" type="Business.Utility.SendToTest.Configuration.SendToTestIndexConfig, Business.Utility.SendToTest.Configuration"/>
    </sectionGroup>
etc.

  </configSections>
    <SendToTestConfig xmlns="Business.Utility.SendToTest.Configuration">
      <sendToTestIndexConfig>
        <appGroups>
          <!-- TODO Change indexFileNamePrefix to desired value-->
          <appGroupSettings name="ItemBased" indexFileNamePrefix="S" indexFolderLocation="C:\TFS\Mainline\Business.Utility.SendToTest\Business.Utility.SendToTest" imageFolderLocation="C:\TFS\Mainline\Business.Utility.SendToTest\Business.Utility.SendToTest">
            <topicEntries>
              <topicEntry topicIDSuffix="DATE" addDuplicateVSAMEntry="true">
                <itemSubFields>
                  <subField index="0" typeName="Date"/>
                </itemSubFields>
              </topicEntry>
              <topicEntry topicIDSuffix="Item" addDuplicateVSAMEntry="true">
                <itemSubFields>
                  <subField index="0" typeName="ItemNumber"/>
                </itemSubFields>
              </topicEntry>
              <topicEntry topicIDSuffix="DESCR">
                <itemSubFields>
                  <subField index="0" typeName="LongDescription"/>
                </itemSubFields>
              </topicEntry>
            </topicEntries>
          </appGroupSettings>
      </appGroups>
    </sendToTestIndexConfig>
  </SendToTestConfig>
...
</configuration>

我已经尝试了以下所有的方法,但是我一直为最初的几个config (我认为这是有意义的)获取config,并为其余的config获取上述的例外。

代码语言:javascript
复制
//These return null:
SendToTestIndexConfig config = SendToTestIndexConfig.Instance;
//SendToTestIndexConfig config = (SendToTestIndexConfig) ConfigurationManager.GetSection("sendToTestIndexConfig");
//SendToTestIndexConfig configb = (SendToTestIndexConfig)WebConfigurationManager.GetSection("sendToTestIndexConfig");
//SendToTestIndexConfig configc = (SendToTestIndexConfig)WebConfigurationManager.OpenWebConfiguration(null).GetSection("sendToTestIndexConfig");
//SendToTestIndexConfig configd = (SendToTestIndexConfig)WebConfigurationManager.GetWebApplicationSection("sendToTestIndexConfig");
//SendToTestIndexConfig configf = (SendToTestIndexConfig)WebConfigurationManager.GetSection("sendToTestIndexConfig");


////These throw a "parameterless constructor error" on object "SendToTestConfig/sendToTestIndexConfig"
//SendToTestIndexConfig configg = (SendToTestIndexConfig)WebConfigurationManager.GetSection("SendToTestConfig/sendToTestIndexConfig");
//SendToTestIndexConfig configh = (SendToTestIndexConfig)WebConfigurationManager.OpenWebConfiguration(null).GetSection("SendToTestConfig/sendToTestIndexConfig");
//SendToTestIndexConfig configi = (SendToTestIndexConfig)WebConfigurationManager.GetWebApplicationSection("SendToTestConfig/sendToTestIndexConfig");
//SendToTestIndexConfig configj = (SendToTestIndexConfig)WebConfigurationManager.GetSection("SendToTestConfig/sendToTestIndexConfig");

我猜这和我的名字有关吧。ConfigurationManager.AppSettings工作得很好,所以我知道我有正确的web.config。

EN

回答 2

Stack Overflow用户

发布于 2012-09-22 18:35:46

实际上,这个问题的解决方案在GenericEnumConverter on MSDN的示例中得到了简洁的说明。我做了您可能做过的同样的事情,并显式地在我的配置部分属性上设置了[TypeConverter(typeof(GenericEnumConverter))] attrbibute,并得到了相同的错误。根据上面链接到的GenericEnumConverter文档,您不需要设置这个属性就可以使用GenericEnumConverter类型转换器--它被框架隐式调用。从配置属性规范中删除该属性,此错误就会消失,一切都应该正常工作。

下面是使用Enum的配置节属性的示例

代码语言:javascript
复制
    public enum UsernameFormat
    {
        DownLevelDomainName,
        UsernameOnly,
        UserPrincipalName
    }

    public class WindowsADElement : ConfigurationElement
    {
        // This property will implicitly use the GenericEnumConverter type converter.
        [ConfigurationProperty("usernameFormat", IsRequired=true, DefaultValue=UsernameFormat.UserPrincipalName)]
        public UsernameFormat UsernameFormat
        {
            get { return (UsernameFormat)this["usernameFormat"]; }
            set { this["usernameFormat"] = value; }
    }

然后,在代码中使用它:

代码语言:javascript
复制
    MyConfigurationSection config = ConfigurationManager.GetSection("myConfigurationSection") as MyConfigurationSection;
    UsernameFormat format = config.UsernameLookup.WindowsAD.UsernameFormat;

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2012-03-14 18:41:21

我不知道这是否是最好的解决办法,但我能够解决这个问题。这个错误是因为我使用GenericEnumTypeConverter类将配置字符串转换为AppGroupSubFieldTypes枚举。我创建了自己的自定义TypeConverters,它解决了这个问题。显然,GenericEnumTypeConverter没有无参数的构造函数,需要构造函数的枚举类型。我很想知道是否有一种使用GenericEnumTypeConverter的方法,但这对我有效。

这让我明白了答案:具有自定义行为的配置错误

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9687795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档