0

Итак, я сделал обработчик пользовательского раздела для чтения информации из файла app-config, но когда я попытаюсь запустить его, я получаю следующую ошибку: ссылка на объект не установлена ​​в экземпляр объект.App-config, объект обработчика пользовательского поля, возвращающийся как null

Я пытался решить эту проблему в течение двух дней, теперь не повезло

Вот посмотрите на мой код: App - конфиг

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <!-- Configuration section-handler declaration area. --> 
    <configSections> 
     <sectionGroup name="propertyValuesGroup"> 
      <section 
      name="propertyValues" 
      type="FlatFileTestCaseAutomater.ClaimHeaderSection,FlatFileFactory" 
      allowLocation="true" 
      allowDefinition="Everywhere" 
      /> 
     </sectionGroup> 
    <!-- Other <section> and <sectionGroup> elements. --> 
    </configSections> 

    <!-- Configuration section settings area. --> 

    <propertyValuesGroup> 

    <propertyValues> 
     <property> 
     <clear/> 
     <claimHeader name="txnNo" nullable="yes" dataType="int" maxLength="20" /> 
     <claimHeader name="batchNo" nullable="yes" dataType="string" maxLength="20" /> 
     </property> 
    </propertyValues> 

    </propertyValuesGroup> 


</configuration> 

Мой пользовательский раздел обработчика:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Configuration; 
using System.Xml; 

namespace FlatFileTestCaseAutomater 
{ 
    class ClaimHeaderSection : ConfigurationSection 
    { 

     [ConfigurationProperty("claimHeader")] 
     public ClaimHeaderElement ClaimHeaderProperty 
     { 
      get 
      { 
       return (ClaimHeaderElement)this["claimHeader"]; 
      } 
      set 
      { this["claimHeader"] = value; } 
     } 
    } 





    public class ClaimHeaderElement : ConfigurationElement 
    { 
     [ConfigurationProperty("name", DefaultValue = "", IsRequired = true)] 
     public String Name 
     { 
      get 
      { 
       return (String)this["name"]; 
      } 
      set 
      { 
       this["name"] = value; 
      } 
     } 

     [ConfigurationProperty("nullable", DefaultValue = "yes", IsRequired = true)] 
     public String Nullable 
     { 
      get 
      { 
       return (String)this["nullable"]; 
      } 
      set 
      { 
       this["nullable"] = value; 
      } 
     } 

     [ConfigurationProperty("dataType", DefaultValue = "", IsRequired = true)] 
     public String DataType 
     { 
      get 
      { 
       return (String)this["dataType"]; 
      } 
      set 
      { 
       this["dataType"] = value; 
      } 
     } 

     [ConfigurationProperty("maxLength", DefaultValue = "", IsRequired = true)] 
     public string MaxLength 
     { 
      get 
      { return (string)this["maxLength"]; } 
      set 
      { this["maxLength"] = value; } 
     } 

    } 

} 

И называя объект:

FlatFileTestCaseAutomater.ClaimHeaderSection config = 
    (FlatFileTestCaseAutomater.ClaimHeaderSection)System.Configuration.ConfigurationManager.GetSection(
    "propertyValuesGroup/propertyValues/property/"); 
+0

Вы не упомянули язык программирования. Это похоже на C#. Предполагая, что это так, я предлагаю удалить один из существующих тегов и заменить его тегом C#. Это значительно увеличило бы видимость вашего вопроса и возможности быстро ответить на него. – Eran

+0

Whoops, Thanks – Steve2056726

ответ

1

Вы получаете нуль, поскольку раздел путь неправильно, он должен быть:

ClaimHeaderSection config = 
(ClaimHeaderSection)System.Configuration.ConfigurationManager.GetSection(
"propertyValuesGroup/propertyValues"); 

Но сейчас, как вы спроектировали раздел пользовательских настроек, если вы положили, что правильный путь, вы получите ConfigurationErrorsException с message "Свойство непризнанного элемента". "

Основываясь на конфигурации, которую вы опубликовали, вам нужна коллекция ClaimHeaderElement, но вы не определяете ConfigurationElementCollection в своем настраиваемом разделе, вместо этого вы определяете ConfigurationElement.

Для того, чтобы работать, вы должны реализовать ConfigurationElementCollection, что-то вроде этого:

public class ClaimHeaderCollection : ConfigurationElementCollection 
{ 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new ClaimHeaderElement(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((ClaimHeaderElement)element).Name; 
    } 

    public override ConfigurationElementCollectionType CollectionType 
    { 
     get 
     { 
      return ConfigurationElementCollectionType.AddRemoveClearMap; 
     } 
    } 
} 

Теперь в пользовательском разделе вы должны добавить коллекцию:

public class ClaimHeaderSection : ConfigurationSection 
{ 
    [ConfigurationProperty("property", IsDefaultCollection = false)] 
    [ConfigurationCollection(typeof(ClaimHeaderCollection), 
     AddItemName = "add", 
     ClearItemsName = "clear", 
     RemoveItemName = "remove")] 
    public ClaimHeaderCollection ClaimHeaders 
    { 
     get 
     { 
      return (ClaimHeaderCollection)this["property"]; 
     } 
     set 
     { this["property"] = value; } 
    } 

    public static ClaimHeaderSection GetConfiguration() 
    { 
     return GetConfiguration("propertyValuesGroup/propertyValues"); 
    } 

    public static ClaimHeaderSection GetConfiguration(string section) 
    { 
     return ConfigurationManager.GetSection(section) as ClaimHeaderSection; 
    } 
} 

Обратите внимание, что я добавил два статических методы, называемые GetConfiguration, это облегчит получение раздела конфигурации:

ClaimHeaderSection config = ClaimHeaderSection.GetConfiguration(); 

В вашей конфигурации вы должны изменить имя элементов конфигурации из ClaimHeader, чтобы добавить, если вы хотите, чтобы узел xml был вызван requireHeader вместо добавления, вы должны изменить значение AddItemName в атрибуте ConfigurationCollection из add to ClaimHeader. Я оставлю это в «add», потому что я положил добавить в атрибут:

<!-- Configuration section settings area. --> 
<propertyValuesGroup> 
    <propertyValues> 
    <property> 
     <clear/> 
     <add name="txnNo" nullable="yes" dataType="int" maxLength="20" /> 
     <add name="batchNo" nullable="yes" dataType="string" maxLength="20" /> 
    </property> 
    </propertyValues> 
</propertyValuesGroup> 
+0

Спасибо за ответ, так что это была очевидная ошибка, не используя configurationElementCollection, im все еще совершенно новый для этого, я пытался реализовать свой код, но im все равно получал исключение nullReferenceException? – Steve2056726

+0

Я просто пробовал это для меня, я отредактировал ответ, потому что я забыл внести небольшое изменение в конфигурацию, но это не вызовет вам исключение для ссылки на нуль ... Если вы хотите, я могу опубликовать ссылку для вас скачайте небольшой тест, который я только что сделал, и он работает, дайте мне знать. – pablogq

+0

Спасибо, я получил его работу, я не использовал ваш конкретный код в конце, но вы положили меня на правильный путь! Цените помощь! – Steve2056726

Смежные вопросы