C# 在c语言中,如何根据db值调用函数而不使用if/else
我试图根据db值调用函数,而不使用if/else或case。下面是我的示例代码,我认为它会更好地解释自己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
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查找正确的方法就行了。太晚了,解析方法更好。太晚了,解析方法更好。