如何避免冗长的案例陈述

时间:2015-02-16 14:34:58

标签: c#

我有一个实体(实体框架6),它映射到一个有100列名为col_1,col_2等的表。该表是一个现有的遗留表,用于连接到另一个系统,所以它非常通用,永远不会变化

所以实体有100个属性映射到那些列。

public class DataEntity{ 

public string Column1{get;set;}    

...
}

然后我有这样的数据:

var columnNumber = 1;
var data = "The data";

如何在没有冗长的案例陈述的情况下将col_1设置为“数据”?

var dataEntity = new DataEntity();

这是我不想做的事情:

switch(columnNumber)
{
    case 1:
    dataEntity.Column1 = data;
    break;
}

请注意,无法更改实体的结构。

2 个答案:

答案 0 :(得分:2)

如果您绝对无法更改数据结构并且您不想使用switch语句 - 我可能会考虑策略模式的某些实现:

http://www.dofactory.com/net/strategy-design-pattern

如果你不想走那条路,你可以使用反射来设置实体的值,方法是遵循一个约定,其中列总是被命名为#34; col_1"等,但这是非常脆弱。

var myEntity = new MyEntity();
var value = "The data";
var columnNumber = 1;

PropertyInfo propertyInfo = MyEntity.GetType().GetProperty(string.Format("Col_{0}", columnNumber));
propertyInfo.SetValue(myEntity, Convert.ChangeType(value, propertyInfo.PropertyType), null);

答案 1 :(得分:1)

我肯定会使用ExpandoObject将我想要的任何内容推送到虚拟对象中,然后将其映射到类的特定实例...

您可以从此答案中获取映射器代码: https://codereview.stackexchange.com/questions/1002/mapping-expandoobject-to-another-object-type

假设你有一个代表你的神圣母亲的数据库 - 数据库表的类

class LegacyTable
{
    public string Column1 { get; set; }
    public string Column2 { get; set; }
    public string Column3 { get; set; }
    // More to come
}

现在,您可以轻松地在动态对象上工作。

dynamic expando = new ExpandoObject();
expando.Column1 = "Data 1";
expando.Column2 = "Data 2";
// Etcetera

您还可以将expando转换为字典以便快速访问(特别是如果您的属性遵循模式“列”+数字

var p = expando as IDictionary<String, object>;

p["Column" + 1] = "Data 1";
p["Column" + 2] = "Data 2";
p["Column" + 3] = "Data 3";

现在,您可以使用映射器将您的道具传递给遗留类的实际实例。

LegacyTable legacy = new LegacyTable();
Mapper<LegacyTable>.Map(expando, legacy);

它只是有效......

Magic