Как реализовать вызов по имени в C #? - PullRequest
5 голосов
/ 26 октября 2010

Может кто-нибудь сказать мне, как я могу реализовать Вызов по имени в C # ?

Ответы [ 5 ]

9 голосов
/ 26 октября 2010

Передайте лямбда-функцию вместо значения.C # охотно оценивается так, чтобы отложить выполнение так, чтобы каждый сайт переоценивал предоставленные аргументы, которые вам нужны для переноса аргументов в функцию.Класс, если вы находитесь в .NET 4.0, чтобы получить аналогичный (но не идентичный) эффект.Lazy запоминает результат, поэтому при повторном доступе не требуется повторная оценка функции.

2 голосов
/ 18 декабря 2014
public enum CallType
{
/// <summary>
/// Gets a value from a property.
/// </summary>
Get,
/// <summary>
/// Sets a value into a property.
/// </summary>
Let,
/// <summary>
/// Invokes a method.
/// </summary>
Method,
/// <summary>
/// Sets a value into a property.
/// </summary>
Set
}

/// <summary>
/// Allows late bound invocation of
/// properties and methods.
/// </summary>
/// <param name="target">Object implementing the property or method.</param>
/// <param name="methodName">Name of the property or method.</param>
/// <param name="callType">Specifies how to invoke the property or method.</param>
/// <param name="args">List of arguments to pass to the method.</param>
/// <returns>The result of the property or method invocation.</returns>
public static object CallByName(object target, string methodName, CallType callType, params object[] args)
{
  switch (callType)
  {
    case CallType.Get:
      {
        PropertyInfo p = target.GetType().GetProperty(methodName);
        return p.GetValue(target, args);
      }
    case CallType.Let:
    case CallType.Set:
      {
        PropertyInfo p = target.GetType().GetProperty(methodName);
        p.SetValue(target, args[0], null);
        return null;
      }
    case CallType.Method:
      {
        MethodInfo m = target.GetType().GetMethod(methodName);
        return m.Invoke(target, args);
      }
  }
  return null;
}
2 голосов
/ 26 октября 2010

Вы можете сделать это, используя Отражение :

using System;
using System.Reflection;

class CallMethodByName
{
   string name;

   CallMethodByName (string name)
   {
      this.name = name;
   }

   public void DisplayName()      // method to call by name
   {
      Console.WriteLine (name);   // prove we called it
   }

   static void Main()
   {
      // Instantiate this class
      CallMethodByName cmbn = new CallMethodByName ("CSO");

      // Get the desired method by name: DisplayName
      MethodInfo methodInfo = 
         typeof (CallMethodByName).GetMethod ("DisplayName");

      // Use the instance to call the method without arguments
      methodInfo.Invoke (cmbn, null);
   }
}
1 голос
/ 26 октября 2010

Если вы имеете в виду это , то я думаю, что ближайшим эквивалентом будут делегаты.

0 голосов
/ 05 апреля 2012

Почему бы не использовать

Microsoft.VisualBasic.Interaction.CallByName
...