我有一个app.config文件:
<appSettings>
<add key="tag1_name" value="tag1"/>
<add key="tag1_access" value="readWritable"/>
<add key="tag1_defaultValue" value="0"/>
<add key="tag2_name" value="tag2"/>
<add key="tag2_access" value="readable"/>
<add key="tag2_defaultValue" value="10"/>
and etc.
</appSettings>
和MyClass一样。
public class MyClass
{
public string tagName;
public string tagAccess;
public string tagValue;
}
我的任务是读取app.config文件中的所有标签(它接近400),并填写它的数据以指定类对象的属性。每个类都包含这3个proprty,所以我应该填充它,然后创建Myclass的新对象。
for (int i = 1; i <= ConfigurationManager.AppSettings.Count / 3; i++)
{
try
{
string tag_name = "tag" + i + "_name";
string tag_access = "tag" + i + "_access";
string tag_defaultValue = "tag" + i + "_defaultValue";
if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings[tag_name]) &&
!string.IsNullOrEmpty(ConfigurationManager.AppSettings[tag_access]) &&
!string.IsNullOrEmpty(ConfigurationManager.AppSettings[tag_defaultValue]))
{
[THERE I SHOULD DYNAMICALLY CREATE OBJECTS OF CLASS]
++tag_count;
}
}
catch(Exception ex)
{
logger.ExceptionMessage(ex.Message);
}
}
如何在需要时通过代码动态创建MyClass的对象,然后从配置文件填充它们的数据属性?
答案 0 :(得分:1)
您的类中只有一个构造函数,然后从app.config
初始化属性public MyClass() {
tagName = ConfigurationManager.AppSettings["tag1_name"].ToString();
tagAccess = ConfigurationManager.AppSettings["tag1_access"].ToString();
tagValue = ConfigurationManager.AppSettings["tag1_defaultValue"].ToString();
}
答案 1 :(得分:1)
您可以使用.state('category', {
url: 'category/:category',
templateUrl: 'list_posts.html'
})
代替ExpandoObject
,以便在从配置文件或任何其他来源读取后创建动态属性。
MyClass
此代码与下面相同,您可以像使用类及其属性一样使用它。
var MyClass = new ExpandoObject() as IDictionary<string, Object>;
MyClass.Add("tag1_name", ConfigurationManager.AppSettings["tag1_name"].ToString());
MyClass.Add("tag1_access", ConfigurationManager.AppSettings["tag1_access"].ToString());
MyClass.Add("tag1_defaultValue", ConfigurationManager.AppSettings["tag1_defaultValue"].ToString());
可以按以下代码访问此对象。
dynamic MyClass = new ExpandoObject();
MyClass.tag1_name = ConfigurationManager.AppSettings["tag1_name"].ToString());
MyClass.tag1_access = ConfigurationManager.AppSettings["tag1_access"].ToString());
MyClass.tag1_defaultValue = ConfigurationManager.AppSettings["tag1_defaultValue"].ToString());
更新了来自动态问题和ExpendoObject的代码:
object tag1Name = MyClass.tag1_name;
object tag1Access = MyClass.tag1_access;
object tag1DefaultValue = MyClass.tag1_defaultValue;
答案 2 :(得分:0)
我基于@OmarAbbas代码,但是使用更简单的类 - 不需要动态,并将一些行分开以便于调试和阅读。
var myClassList = new List<MyClass>();
for (int i = 1; i <= ConfigurationManager.AppSettings.Count / 3; i++)
{
try
{
/* Prepare index keys to config */
string tagNameConfigCode = "tag" + i + "_name";
string tagAccessConfigCode = "tag" + i + "_access";
string tagDefaultValueConfigCode = "tag" + i + "_defaultValue";
/* If they contain data, we'll create a class from them */
if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings[tagNameConfigCode ]) &&
!string.IsNullOrEmpty(ConfigurationManager.AppSettings[tagAccessConfigCode ]) &&
!string.IsNullOrEmpty(ConfigurationManager.AppSettings[tagDefaultValueConfigCode ]))
{
/* Preparing the values - easier to debug and read */
var tagNameValue = ConfigurationManager.AppSettings[tagNameConfigCode];
var tagAccessValue = ConfigurationManager.AppSettings[tagAccessConfigCode];
var tagDefaultValueValue = ConfigurationManager.AppSettings[tagDefaultValueConfigCode];
/* Creating the class for each trio of values */
var myClass = new MyClass()
{
tagName = tagNameValue,
tagAccess = tagAccessValue,
tagValue = tagDefaultValueValue
};
/* Once done, adding to the list - here you'll have all your classes in one place */
myClassList.Add(myClass );
}
}
catch(Exception ex)
{
logger.ExceptionMessage(ex.Message);
}
}