C# 如何避免冗长的案例陈述
我有一个实体(实体框架6),它映射到一个表,该表有100列,分别命名为col_1、col_2等。该表是一个现有的遗留表,用于与另一个系统进行接口,因此它非常通用,永远不会更改 因此,实体有100个属性映射到这些列C# 如何避免冗长的案例陈述,c#,C#,我有一个实体(实体框架6),它映射到一个表,该表有100列,分别命名为col_1、col_2等。该表是一个现有的遗留表,用于与另一个系统进行接口,因此它非常通用,永远不会更改 因此,实体有100个属性映射到这些列 public class DataEntity{ public string Column1{get;set;} ... } 然后我有如下数据: var columnNumber = 1; var data = "The data"; 在没有长case语句的情况下,如
public class DataEntity{
public string Column1{get;set;}
...
}
然后我有如下数据:
var columnNumber = 1;
var data = "The data";
在没有长case语句的情况下,如何将col_1设置为“数据”
var dataEntity = new DataEntity();
这是我不想做的:
switch(columnNumber)
{
case 1:
dataEntity.Column1 = data;
break;
}
请注意,不可能更改实体的结构。如果绝对不能更改数据结构,并且不想使用switch语句,我可能会研究策略模式的一些实现: 如果您不想这样做,您可以使用反射来设置实体的值,方法是遵循一个约定,其中列将始终命名为“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);
如果绝对不能更改数据结构,并且不想使用switch语句,我可能会研究策略模式的一些实现: 如果您不想这样做,您可以使用反射来设置实体的值,方法是遵循一个约定,其中列将始终命名为“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);
如果绝对不能更改数据结构,并且不想使用switch语句,我可能会研究策略模式的一些实现: 如果您不想这样做,您可以使用反射来设置实体的值,方法是遵循一个约定,其中列将始终命名为“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);
如果绝对不能更改数据结构,并且不想使用switch语句,我可能会研究策略模式的一些实现: 如果您不想这样做,您可以使用反射来设置实体的值,方法是遵循一个约定,其中列将始终命名为“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);
我肯定会使用ExpandoObject将我想要的任何东西推送到虚拟对象中,然后将其映射到类的特定实例 您可以从以下答案中获取映射器代码: 假设您有一个类,它表示您的100列神圣母亲数据库表
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强制转换为字典,以便快速访问(特别是当您的属性遵循模式“Column”+数字时)
var p=expando作为索引;
p[“列”+1]=“数据1”;
p[“列”+2]=“数据2”;
p[“列”+3]=“数据3”;
现在,您可以使用映射器将道具复制到遗留类的实际实例
LegacyTable legacy = new LegacyTable();
Mapper<LegacyTable>.Map(expando, legacy);
LegacyTable legacy=new LegacyTable();
Mapper.Map(expando,遗留);
它只是工作
我肯定会使用ExpandooObject将我想要的任何东西推送到虚拟对象中,然后将其映射到类的特定实例 您可以从以下答案中获取映射器代码: 假设您有一个类,它表示您的100列神圣母亲数据库表
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强制转换为字典,以便快速访问(特别是当您的属性遵循模式“Column”+数字时)
var p=expando作为索引;
p[“列”+1]=“数据1”;
p[“列”+2]=“数据2”;
p[“列”+3]=“数据3”;
现在,您可以使用映射器将道具复制到遗留类的实际实例
LegacyTable legacy = new LegacyTable();
Mapper<LegacyTable>.Map(expando, legacy);
LegacyTable legacy=new LegacyTable();
Mapper.Map(expando,遗留);
它只是工作
我肯定会使用ExpandooObject将我想要的任何东西推送到虚拟对象中,然后将其映射到类的特定实例 您可以从以下答案中获取映射器代码: 假设您有一个类,它表示您的100列神圣母亲数据库表
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强制转换为字典,以便快速访问(特别是当您的属性遵循模式“Column”+数字时)
var p=expando作为索引;
p[“列”+1]=“数据1”;
p[“列”+2]=“数据2”;
p[“列”+3]=“数据3”;
现在,您可以使用映射器将道具复制到遗留类的实际实例
LegacyTable legacy = new LegacyTable();
Mapper<LegacyTable>.Map(expando, legacy);
LegacyTable legacy=new LegacyTable();
Mapper.Map(expando,遗留);
它只是工作
我肯定会使用ExpandooObject将我想要的任何东西推送到虚拟对象中,然后将其映射到类的特定实例 您可以从以下答案中获取映射器代码: 假设您有一个类,它表示您的100列神圣母亲数据库表
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强制转换为字典,以便快速访问(特别是当您的属性遵循模式“Column”+数字时)
var p=expando作为索引;
p[“列”+1]=“数据1”;
p[“列”+2]=“数据2”;
p[“列”+3]=“数据3”;
现在,您可以使用映射器将道具复制到遗留类的实际实例
LegacyTable legacy = new LegacyTable();
Mapper<LegacyTable>.Map(expando, legacy);
LegacyTable legacy=new LegacyTable();
Mapper.Map(expando,遗留);
它只是工作
实体如何映射到表中?您使用的是ORM吗(如果是哪一个)?还有,100列…真的吗?您不能做一些类似于
string colName=“col_”+columnNumber;row[colName]=data;
?字典
?嗯…我在这里没有看到任何开关盒代码…(另外,我今天仍然没有咖啡)是的,这一澄清很有帮助。所以在查询中你永远不需要列号?如果这是正确的,那么Ian的答案可能就是你所需要的。实体如何