创建一个类

时间:2013-08-01 20:29:07

标签: c# asp.net class dynamic

是否可以执行以下操作,如果没有,是否有更好的方法来完成我想要完成的任务?

Person.cs

    public class Person
    {
        public string ID { get; set; }
        public string Name { get; set; }
        public string Zip { get; set; }

        public Person()
        {
        }

我想做这个部分,所以我可以动态地调用基于列表所在部分的方法,我不确定是否有更好的方法。

        public void Assign(string k, string v)
        {
            k = v;
        }

public string getKeyValue(string k, int w, char d)
    {
        string[] value = k.Split(d);
        int i = 0;
        foreach (string part in value)
        {
            if (i == w)
            {
                k = part;
            }
            i++;
        }

        return k;
    }
    }

然后在代码后面调用它就像这样

Default.aspx.cs

List<string> initList = new List<string> 
{ 
    "ID = 1", "Name = this is a test", "Zip = 5","ID = 2", "Name = this is a second test", "Zip = 10"        
};

List<object> myList = new List<object>();

Person prs = new Person();
foreach (string txt in initList)
{
    string key = prs.getKeyValue(txt,0,'=');
    string val = prs.getKeyValue(txt,1,'=');

    prs.Assign(key,val);

}

 myList.Add(prs);

3 个答案:

答案 0 :(得分:0)

在考虑了一些之后,我认为你认为传递字符串是一种更好的分配方式:

List<string> initList = new List<string> 
{ 
    "ID = 1", "Name = this is a test", "Zip = 5","ID = 2", "Name = this is a second test", "Zip = 10"        
};

这样做有什么问题:

var people = new List<Person>()
{
    new Person()
    {
        ID=1,
        Name="this is a test",
        Zip=5
    },
    new Person()
    {
        ID=2,
        Name="this is a second test",
        Zip=10
    }
};

第二个选项具有intellisense,如果存在无效条目,则在编译时中断。它看起来并不聪明,还有更多的打字(可能),但这种方式更不容易出错。

现在,您可以遍历您的人员列表,而不是像Assign那样执行一些通用操作,您可以执行ShowZipCodeDisplayName等描述性操作。这将导致更易读,易懂和(最重要的)可维护代码。

修改的 好的,这很容易:

将整个平面文件读入我们称之为flatFileData的字符串。

然后使用逗号分隔它:

var arrayOfProperties = flatFileData.Split(',');

现在,嵌套循环以三个方式读取数据(因为你有三个属性):

var people=new List<Person>();
for(int i=0;i<arrayOfProperties.Length;i=i+3)
{
    var rawId=arrayOfProperties[i];
    var rawName=arrayOfProperties[i+1];
    var rawZip=arrayOfProperties[i+2];

    // Get the data out of the raw entry
    var id=rawId.Substring(rawId.LastIndexOf('=')).Trim();
    var name=rawName.Substring(rawName.LastIndexOf('=')).Trim();
    var zip=rawZip.Substring(rawZip.LastIndexOf('=')).Trim();

    // Make a constructor for Person that takes these values
    people.Add(new Person(id,name,zip));
}

rawId.Substring ...部分可以重构为一个方法,但不想让解决方案比以前更麻烦。你明白我在做什么吗?

答案 1 :(得分:0)

这是一个评论,但我想展示一些代码。

添加一个带有以下参数的构造函数。(如果你愿意,可以添加更多参数,如zipcode)

public Person(string id, string name)
{
    this.ID = id;
    this.Name = name;
}

在Person类之外编写方法GetKeyValue,可以将其移动到Default.aspx.cs &安培;在foreach循环中调用它

Person prs;
foreach (string txt in initList)
{
    string key = GetKeyValue(txt,0,'=');
    string val = GetKeyValue(txt,1,'=');

    prs = new Person(key, val);
    myList.Add(prs);
}

答案 2 :(得分:0)

你试图这样做的方式非常可怕;因为有很多可能的错误。这是一个非常hacky和容易出错的方式...但它会让你知道如何用反射做到这一点......

List<string> initList = new List<string> 
{ 
    "ID = 1", 
    "Name = this is a test", 
    "Zip = 5", 
    "ID = 2", 
    "Name = this is a second test", 
    "Zip = 10" 
};

List<Person> list = new List<Person>();
Person person = null;
Type type = typeof(Person);
foreach (var str in initList)
{
    var pair = str.Split('=').Select(s => s.Trim()).ToArray();
    if (pair[0] == "ID")
    {
        person = new Person();
        list.Add(person);
    }
    if (person != null)
    {
        PropertyInfo property = type.GetProperty(pair[0]);
        if (property != null)
            property.SetValue(person, pair[1]);
    }
}

foreach (var item in list)
    Console.WriteLine(item.ID);

Console.ReadLine();