情境:
我有我的函数名称,并且存储在数据库中的参数。函数名称和参数将从数据库返回
"FunctionName(Convert.ToString("harry"),Convert.ToString("Password"),Convert.ToInt32("5"),Convert.ToString(""),Convert.ToString("AMER_02772"),Convert.ToInt32("0"))"
问题:
现在我想执行这个函数作为字符串返回给我?请指导我执行此字符串的方法?
我读过类似的帖子但找不到确切的结果。
答案 0 :(得分:0)
您可以使用GetMethod
,这是示例代码
using System;
using System.Reflection;
static class Methods
{
public static void Inform(string parameter)
{
Console.WriteLine("Inform:parameter={0}", parameter);
}
}
class Program
{
static void Main()
{
// Name of the method we want to call.
string name = "Inform";
// Call it with each of these parameters.
string[] parameters = { "Sam", "Perls" };
// Get MethodInfo.
Type type = typeof(Methods);
MethodInfo info = type.GetMethod(name);
// Loop over parameters.
foreach (string parameter in parameters)
{
info.Invoke(null, new object[] { parameter });
}
}
}
Output
Inform:parameter=Sam
Inform:parameter=Perls
或强>
您可以参考Dynamically invoking any function by passing function name as string!
CodeProject
链接Dynamically Invoke A Method, Given Strings with Method Name and Class Name!
答案 1 :(得分:0)
举个例子:
var csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" });
parameters.GenerateExecutable = false;
CompilerResults results = csc.CompileAssemblyFromSource(parameters,
@"using System.Linq;
class MyClass {
public void MyFunction() {
var q = from i in Enumerable.Range(1,100)
where i % 2 == 0
select i;
}
}");
results.Errors.Cast<CompilerError>().ToList().ForEach(error => Console.WriteLine(error.ErrorText));
答案 2 :(得分:0)
您可以使用CodeDomProvider
编译C#代码。然后使用反射来获取类型信息,创建一个对象并调用它的方法。
有关示例,请参阅this answer。
这基本上是它的工作原理:
string source = ...
string references = ...
// Compile
CodeDomProvider provider = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters(references);
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
CompilerResults res = provider.CompileAssemblyFromSource(cp, source);
// Extract object
Type t = res.CompiledAssembly.GetType(className);
MethodInfo method = t.GetMethod(methodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); // Get method
// Run
object instance = Activator.CreateInstance(t, this);
object ret = method.Invoke(instance, null);