在c#中,如何根据db值调用函数而不使用if / else

时间:2016-01-27 11:26:27

标签: c# dynamic

我试图根据db值调用函数而不使用if / else或case。我的示例代码如下,我认为它会更好地解释自己。

LogoObj.Data ms = logoApp.NewObj(LogoObj.DataObjType.Item); // Item

“Item”信息来自SELECT查询。 “项目”也可以是“客户”。因此,我不想写下面的代码。

if(datatable_result.Rows[0][0].ToString()=="ITEM")
   ms = logoApp.NewObj(LogoObj.DataObjType.Item);
else if(datatable_result.Rows[0][0].ToString()=="CUSTOMER")
   ms = logoApp.NewObj(LogoObj.DataObjType.Customer);
.........
.........
.........

我可以在下面找到一些,因为这是我需要的东西

LogoObj.Data ms = logoApp.NewObj(LogoObj.DataObjType.XXXXXDB_VALUEXXXXX);

5 个答案:

答案 0 :(得分:2)

您可以使用Enum.Parse

var enumValue = Enum.Parse(typeof(LogoObj.DataObjType), datatable_result.Rows[0][0].ToString(), true); //true = ignore case
ms = logoApp.NewObj(enumValue);

如果数据库中的项目可能与任何枚举值都不匹配,则应使用Enum.TryParse并检查以确保在调用NewObj之前已正确解析该值。< / p>

答案 1 :(得分:1)

所以这就是我的想法: 从数据表中获取要创建的对象类型。 使用反射循环通过LogoObj。 DataObj类型枚举。 如果找到您的对象类型,请使用它调用New_Obj()方法。

 string str = datatable_result.Rows[0][0].ToString();
 LogoObj.Data ms;
 foreach (var dataObjType in Enum.GetValues(typeof(LogoObj.DataObjType)))
 {
            if (str == dataObjType.ToString())
            {
                ms = logoApp.NewObj(dataObjType);
            }

 }

答案 2 :(得分:0)

您是否正在寻找一种基于方法名称在程序集中调用方法的编程方法? 考虑使用反射?注意:下面的代码是伪代码。

MethodInfo mi = obj.GetType().GetMethod("MethodName");
var result = mi.Invoke();

答案 3 :(得分:0)

你可以使用反思,但是如果你要进行多次通话,我会建议你这个由Marc Gravell制作的项目:Fast-Member

  

.NET反射很慢......好吧,有点慢。如果你需要访问   具有已知类型和成员名称的任意类型的成员   仅在运行时 - 然后坦率地说很难(特别是对于DLR类型)。   该库使这种访问变得简单快捷。

例如:

// This should be done in some initialization code and reuse the accessor
// everywhere in your app...
var accessor = TypeAccessor.Create(LogoObj.DataObjType.GetType()); 

string propName = datatable_result.Rows[0][0].ToString().ToLowerInvariant();
propName = propName[0].ToUpper() + propName.Substring(1);

ms = logoApp.NewObj(accessor[LogoObj.DataObjType, propName]);

答案 4 :(得分:-1)

怎么样?
var table = new Dictionary<string,Action> {
                                           {"ITEM", () => Console.WriteLine("Item!")},
                                           {"CUSTOMER", () => Console.WriteLine("Customer!")},
                                          };

并像

一样使用它
table[datatable_result.Rows[0][0].ToString()]();

如果您需要通话结果,请使用Func<>代替Action

var ms = table[datatable_result.Rows[0][0].ToString()]();