我试图根据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);
答案 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()]();