如何通过代码动态创建myclass的对象?

时间:2017-03-20 10:59:50

标签: c# .net

我有一个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的对象,然后从配置文件填充它们的数据属性?

3 个答案:

答案 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);
        }
 }