2

我有一个名为Variableswhich has的表(Id ,AdId,Variable1,Variable2,Variable3,Variable4,Variable5,Variable6,Variable7,Variable8 ) ,并且我有一个List<string> a包含许多字符串(可能是 1、3、6 或 8)的表。

我的问题是如何将列表中的这些字符串插入到变量表中?

我能做这样的事

    Variables v=new Variables();
    v.AdId=2;

if(a.count()==1){

v.variable1=a[0];
}else if(a.count()==2){
v.variable1=a[0];
v.variable2=a[1]
}else if (//so on){}

我想做一些更动态的事情,如下所示:

Variables v=new Variables();
    v.AdId=2;
    for(int i=0; i<a.count() ;i++)
    {
         //here list items to be inserted to (variable1,variable2.....variable8)
         //, depending on list size ,number of variables are inserted
    }
4

4 回答 4

4

您可以使用反射通过GetProperty方法动态访问变量模型的属性。

        Variables v = new Variables();
        var a = new List<int>{ 1, 2, 3, 4, 5, 6 , 7};
        for (int i = 0; i < a.Count; i++)
        {
            String propertyName = "Variable" + i;
            Type myType = v.GetType();
            try
            {
                myType.GetProperty(propertyName).SetValue(v, a[i].ToString());
            }
            catch (NullReferenceException nre)
            {
                Console.WriteLine("Cannot Find Property");
            }
        }

如您所见,我使用字符串访问对象的属性,propertyName因此您可以以访问要修改的属性的方式操作该字符串。

如果我们尝试访问的属性未在类/模型中定义,我最后使用了 try and catch 块。

另请注意,反射可能是一个缓慢的解决方案。不过,您可以寻找方法来大幅提高其性能。

谢谢。希望有帮助。

于 2013-08-14T10:41:56.397 回答
2

使用 Linq to 实体时,您可以尝试以下示例。为了稍后添加 Column 值,您可以使用名为的工厂方法作为选项CreateT,其中T是实体类的名称。

现在,由于您List<string>可以拥有可变数量的项目,因此 Entity 类没有动态方式来获取类似的列:Variables.Columns[i]OR Variables["ColumnName"]。因此,使用任何循环都是可行的,但您仍然需要检查从a[1]to的所有值a[9]

我假设List<string> a按顺序包含值。即包含 Column:等 a[1]的相应值。AdId

 NorthwindEntities db = new NorthwindEntities();
    Variables vrbl = Variables.CreateVariables(a[0]);// usually have atleast one value 
 if(!String.IsNullOrEmpty(a[1]))
    AdId = a[1]; 
 if(!String.IsNullOrEmpty(a[2]))
    Variable1= a[2]; // assign the corresponding values from List of strings 
 if(!String.IsNullOrEmpty(a[3]))
    Variable2= a[3];
 if(!String.IsNullOrEmpty(a[4])) 
    Variable3= a[4];
 if(!String.IsNullOrEmpty(a[5])) 
    Variable4= a[5];
 if(!String.IsNullOrEmpty(a[6]))
    Variable5= a[6];
 if(!String.IsNullOrEmpty(a[7])) 
    Variable6= a[7];
 if(!String.IsNullOrEmpty(a[8])) 
    Variable7= a[8];
 if(!String.IsNullOrEmpty(a[9])) 
    Variable8= a[9];

    db.Variables.AddObject(vrbl); 
    db.SaveChanges();
于 2013-08-14T10:28:27.323 回答
1

试试这个。为了快速 rply .. 可能是肮脏的解决方案

您可以使用 switch case 语句。

Variables v=new Variables();
v.AdId=2;
for(int i=0; i<a.count() ;i++)
{
switch (a.count())
    { 
        case 0:
            v.Variable1 = a[i].ToString();
            break;
        case 1:
            v.Variable1 = a[i].ToString();
            v.Variable2 = a[i++].ToString();
         case 2:
            v.Variable1 = a[i].ToString();
            v.Variable2 = a[i++].ToString();
            v.Variable2 = a[i+2].ToString();
            break;

and so on.....

    }
}
于 2013-08-14T10:16:14.733 回答
1

您可以为变量类编写索引器。但是内部实现必须使用开关或反射来为属性设置值。

于 2013-08-14T11:21:11.903 回答