我怎样才能从正则表达式字符串中调用方法

时间:2010-10-11 13:29:06

标签: c# regex visual-studio-2010

在我的一个项目中,我需要根据正则表达式动态调用方法。在我的一个案例中,我有这个字符串。

  

And(Answered(ARef(16350,100772,null)),Not(AnyOf(ARef(16350,100772,null),[Closed temporarily])),Not(AnyOf(ARef(16350,100772,null),[Closed down])))

如果安排它理解,

会喜欢这个。

  And(
            Answered(
                    ARef(
                    16350,
                    100772,
                    null)
                    ),
                    Not(
                        AnyOf(
                            ARef(
                                16350,
                                100772,
                                null),              
                            [Closed temporarily]
                            )
                       ),
                    Not(
                       AnyOf(
                            ARef(
                                16350,
                                100772,
                                null),
                        [Closed down]
                            )
                      )
        )

有没有办法调用方法名称启动的方法和(“打开括号”参数和)“关闭括号”

在上述情况下,And是一种从应答方法中获取参数的方法。等等....

请建议我找到一种方法。

3 个答案:

答案 0 :(得分:1)

这不是正则表达式问题。您需要为字符串表示的语言实现解析器/解释器。 C#有很多解析器库/工具可以帮助你。

请参阅this list可能相关的Stackoverflow问题和答案

答案 1 :(得分:1)

public static string InvokeStringMethod(string typeName, string methodName)
{
// Get the Type for the class
Type calledType = Type.GetType(typeName);

// Invoke the method itself. The string returned by the method winds up in s
String s = (String)calledType.InvokeMember(
                methodName,
                BindingFlags.InvokeMethod | BindingFlags.Public | 
                    BindingFlags.Static,
                null,
                null,
                null);

// Return the string that was returned by the called method.
return s;

}

参考文献:http://dotnetacademy.blogspot.com/2010/10/invoke-method-when-method-name-is-in.html

http://www.codeproject.com/KB/cs/CallMethodNameInString.aspx

答案 2 :(得分:0)

  • 我不知道你在这里尝试做什么,但它不是一个梦幻般的设计理念。如果您需要提供这种可扩展性,为什么不使用MEF或允许装配在运行中。

但是你可以做你正在尝试使用反射的东西。您甚至可以创建一个即时组件然后运行它。

动态加载和调用对象的示例如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ca1
{

public class A
{
    public int retval(int x)
    {
        return x; 
    }
}


class Program
{

    static void Main(string[] args)
    {
        string s ="retval";
        Type t = typeof(A);
        ConstructorInfo CI = t.GetConstructor(new Type[] {});
        object o = CI.Invoke(new object[]{});
        MethodInfo MI = t.GetMethod(s);
        object[] fnargs = new object[] {4};
        Console.WriteLine("Function retuned : " +MI.Invoke(o, fnargs).ToString());

      }
   }
}