Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免冗长的案例陈述_C# - Fatal编程技术网

C# 如何避免冗长的案例陈述

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语句的情况下,如

我有一个实体(实体框架6),它映射到一个表,该表有100列,分别命名为col_1、col_2等。该表是一个现有的遗留表,用于与另一个系统进行接口,因此它非常通用,永远不会更改

因此,实体有100个属性映射到这些列

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的答案可能就是你所需要的。实体如何