Вы действительно хотите разрешить любой C #?
Если это так, вы можете посмотреть на этот движок сценария для C # . Имейте в виду, что возможность запуска произвольного кода является большой угрозой безопасности.
Если вы в порядке с ожиданием .NET 4.0 (в бета-версии сейчас, выпуск в конце этого года), вы можете использовать для этого DLR или Dynamic Language Runtime.
С другой стороны, если вы не хотите полагаться на .NET 4.0 и хотите ограничиться, вы можете использовать Reflection довольно просто.
Если бы вы могли ограничиться, например, методами экземпляра DateTime, все было бы проще. В этом примере показано, как вызвать метод через отражение в экземпляре DateTime, для которого установлено значение NOW.
DateTime d = DateTime.Now;
string logicToInvoke= "Now.AddDays(12)";
string pattern = @"^Now\.(?<methodname>\w+)\((?<argstring>[^\)]*)\)";
RGX.Match match = RGX.Regex.Match(logicToInvoke, pattern);
// If match not found, logic is improperly formed.
if (!match.Success)
{
Console.WriteLine("The DateTime method logic is improperly formed.");
return;
}
// Store method and arg
string methodName = (string) match.Groups["methodname"].Value;
string argString = (string) match.Groups["argstring"].Value;
Console.WriteLine("Invoking method '{0}' with args '{1}'...", methodName, argString);
System.Type t= d.GetType();
try
{
switch (methodName)
{
case "AddDays" :
int daysToAdd = System.Int32.Parse(argString);
DateTime result = (DateTime) t.InvokeMember (methodName,
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.InvokeMethod ,
null, d, new object [] {daysToAdd});
Console.WriteLine("Result: {0}", result.ToString("yyyy/MM/dd"));
break;
default:
Console.WriteLine("unsupported method: {0}", methodName);
break;
}
}
catch (System.Exception exc1)
{
Console.WriteLine("Exception while invoking method: {0}", exc1);
}
Я бы рекомендовал хранить формат значения DateTime отдельно от его значения. Формат времени («гг / мм / дд») может быть лучше указан в атрибуте, например:
<Name>DateOne</Name>
<Value format="MM/dd/yy">[Now.AddDays(-1)]</Value>