gpt4 book ai didi

c# - 如何将自定义对象的集合存储到 user.config 文件中?

转载 作者:IT王子 更新时间:2023-10-29 04:06:03 26 4
gpt4 key购买 nike

我想在 user.config 文件中存储自定义对象的集合,并想以编程方式在集合中添加和删除项目,然后将修改后的列表保存回配置文件。

我的项目具有以下简单形式:

class UserInfo
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}

在我的 app.config 中,我已经创建了一个自定义部分:

<configuration>
<configSections>
<section name="userInfo" type="UserInfoConfigurationHandler, MyProgram"/>

</configSections>
<userInfo>
<User firstName="John" lastName="Doe" email="john@example.com" />
<User firstName="Jane" lastName="Doe" email="jane@example.com" />
</userInfo>

</configuration>

我还可以通过执行 IConfigurationSectionHandler 来读取设置:

class UserInfoConfigurationHandler : IConfigurationSectionHandler
{
public UserInfoConfigurationHandler() { }

public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
List<UserInfo> items = new List<UserInfo>();
System.Xml.XmlNodeList processesNodes = section.SelectNodes("User");

foreach (XmlNode processNode in processesNodes)
{
UserInfo item = new UserInfo();
item.FirstName = processNode.Attributes["firstName"].InnerText;
item.LastName = processNode.Attributes["lastName"].InnerText;
item.Email = processNode.Attributes["email"].InnerText;
items.Add(item);
}
return items;
}
}

我在这个 article 之后做了所有这些.但是,使用这种方法,我只能将 app.config 中的设置读取List<UserInfo> 中。集合,但我还需要修改后的列表。

我搜索文档没有成功,现在有点卡住了。我错过了什么?

最佳答案

添加自定义配置(如果您需要的不仅仅是简单类型)的方法是使用 ConfigurationSection,在您定义的架构中,您需要一个 ConfigurationElementCollection(设置为没有名称的默认集合),其中包含一个 ConfigurationElement ,如下:

public class UserElement : ConfigurationElement
{
[ConfigurationProperty( "firstName", IsRequired = true )]
public string FirstName
{
get { return (string) base[ "firstName" ]; }
set { base[ "firstName" ] = value;}
}

[ConfigurationProperty( "lastName", IsRequired = true )]
public string LastName
{
get { return (string) base[ "lastName" ]; }
set { base[ "lastName" ] = value; }
}

[ConfigurationProperty( "email", IsRequired = true )]
public string Email
{
get { return (string) base[ "email" ]; }
set { base[ "email" ] = value; }
}

internal string Key
{
get { return string.Format( "{0}|{1}|{2}", FirstName, LastName, Email ); }
}
}

[ConfigurationCollection( typeof(UserElement), AddItemName = "user", CollectionType = ConfigurationElementCollectionType.BasicMap )]
public class UserElementCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new UserElement();
}

protected override object GetElementKey( ConfigurationElement element )
{
return ( (UserElement) element ).Key;
}

public void Add( UserElement element )
{
BaseAdd( element );
}

public void Clear()
{
BaseClear();
}

public int IndexOf( UserElement element )
{
return BaseIndexOf( element );
}

public void Remove( UserElement element )
{
if( BaseIndexOf( element ) >= 0 )
{
BaseRemove( element.Key );
}
}

public void RemoveAt( int index )
{
BaseRemoveAt( index );
}

public UserElement this[ int index ]
{
get { return (UserElement) BaseGet( index ); }
set
{
if( BaseGet( index ) != null )
{
BaseRemoveAt( index );
}
BaseAdd( index, value );
}
}
}

public class UserInfoSection : ConfigurationSection
{
private static readonly ConfigurationProperty _propUserInfo = new ConfigurationProperty(
null,
typeof(UserElementCollection),
null,
ConfigurationPropertyOptions.IsDefaultCollection
);

private static ConfigurationPropertyCollection _properties = new ConfigurationPropertyCollection();

static UserInfoSection()
{
_properties.Add( _propUserInfo );
}

[ConfigurationProperty( "", Options = ConfigurationPropertyOptions.IsDefaultCollection )]
public UserElementCollection Users
{
get { return (UserElementCollection) base[ _propUserInfo ]; }
}
}

我让 UserElement 类保持简单,尽管它确实应该遵循 this excellent CodeProject article 中描述的完全声明每个属性的模式。 .如您所见,它代表您提供的配置中的“用户”元素。

UserElementCollection 类只支持拥有多个“用户”元素,包括如果您想在运行时修改集合,则可以添加/删除/清除集合中的项目。

最后是 UserInfoSection,它简单地表明它具有默认的“用户”元素集合。

接下来是 App.config 文件的示例:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup>
<section
name="userInfo"
type="ConsoleApplication1.UserInfoSection, ConsoleApplication1"
allowDefinition="Everywhere"
allowExeDefinition="MachineToLocalUser"
/>
</sectionGroup>
</configSections>

<userInfo>
<user firstName="John" lastName="Doe" email="John.Doe@company.com" />
<user firstName="Jane" lastName="Doe" email="Jane.Doe@company.com" />
</userInfo>
</configuration>

如您所见,在此示例中,我在 App.config 中包含了一些 userInfo/user 元素。我还添加了设置,表示可以在机器/应用程序/用户/漫游用户级别定义它们。

接下来我们需要知道如何在运行时更新它们,下面的代码展示了一个例子:

Configuration userConfig = ConfigurationManager.OpenExeConfiguration( ConfigurationUserLevel.PerUserRoamingAndLocal );

var userInfoSection = userConfig.GetSection( "userInfo" ) as UserInfoSection;

var userElement = new UserElement();

userElement.FirstName = "Sample";
userElement.LastName = "User";
userElement.Email = "Sample.User@company.com";

userInfoSection.Users.Add( userElement );

userConfig.Save();

如果需要,上面的代码将创建一个新的 user.config 文件,深埋在用户的“Local Settings\Application Data”文件夹中。

如果您希望将新用户添加到 app.config 文件中,只需将 OpenExeConfiguration() 方法的参数更改为 ConfigurationUserLevel.None。

如您所见,它相当简单,尽管查找此信息需要进行一些挖掘。

关于c# - 如何将自定义对象的集合存储到 user.config 文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/734474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com