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

C# 在c语言中,如何根据db值调用函数而不使用if/else,c#,dynamic,C#,Dynamic,我试图根据db值调用函数,而不使用if/else或case。下面是我的示例代码,我认为它会更好地解释自己 LogoObj.Data ms = logoApp.NewObj(LogoObj.DataObjType.Item); // Item 项目信息来自SELECT查询。该项目也可以是客户。因此,我不想写下面这样的代码 if(datatable_result.Rows[0][0].ToString()=="ITEM") ms = logoApp.NewObj(LogoObj.DataOb

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

LogoObj.Data ms = logoApp.NewObj(LogoObj.DataObjType.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);

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

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

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

MethodInfo mi = obj.GetType().GetMethod("MethodName");
var result = mi.Invoke();
那怎么办

var table = new Dictionary<string,Action> {
                                           {"ITEM", () => Console.WriteLine("Item!")},
                                           {"CUSTOMER", () => Console.WriteLine("Customer!")},
                                          };
如果需要调用的结果,请使用Func而不是操作:

那怎么办

var table = new Dictionary<string,Action> {
                                           {"ITEM", () => Console.WriteLine("Item!")},
                                           {"CUSTOMER", () => Console.WriteLine("Customer!")},
                                          };
如果需要调用的结果,请使用Func而不是操作:

您可以使用:

如果数据库中的项可能与任何枚举值都不匹配,则应改用并检查以确保在调用NewObj之前正确解析了该值。

您可以使用:


如果数据库中的项可能与任何枚举值都不匹配,则应在调用NewObj之前使用并检查以确保其正确解析了值。

您可以使用反射,但如果要执行许多调用,我建议您使用Marc Gravell制作的此项目:

.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]);

您可以使用反射,但如果您要执行许多调用,我建议您使用Marc Gravell制作的项目:

.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]);

这就是我的想法: 从数据表中获取要创建的对象类型。 使用反射在LogoObj中循环。DataObj类型枚举。 如果找到了您的对象类型,请使用它调用新的_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);
            }

 }

这就是我的想法: 从数据表中获取要创建的对象类型。 使用反射在LogoObj中循环。DataObj类型枚举。 如果找到了您的对象类型,请使用它调用新的_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);
            }

 }

您可以从数据库中获得哪些可能的值?Dictionary?@FiN,正如我之前所说的,我不想使用case,因为有200多个values@RahulTripathi,有200种可能性。LogoObj.DataObjType是枚举吗?您可以使用Enum.parse查找正确的值。您可以从数据库中获得哪些可能的值?Dictionary?@FiN,正如我之前所说的,我不想使用case,因为有200多个values@RahulTripathi,有200种可能性。LogoObj.DataObjType是枚举吗?您可能只需要使用Enum.ParseAh查找正确的方法就行了。太晚了,解析方法更好。太晚了,解析方法更好。