Фантик динамического поведения


Я пишу обертку для динамическое поведение в C#. Если я буду использовать GetMethod(), то исключение, когда есть больше чем один способ (перегрузки). Я думаю, это станет очевидным во время выполнения, что если есть несоответствие аргумент в любом случае. Это хороший способ, чтобы решить проблему?

public class StaticMembersDynamicWrapper : DynamicObject
{
  private Type _type;

  public StaticMembersDynamicWrapper(Type type) { _type = type; }

  // Handle static methods
  public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
  {
     var methods = _type
        .GetMethods(BindingFlags.FlattenHierarchy | BindingFlags.Static | BindingFlags.Public)
        .Where(methodInfo => methodInfo.Name == binder.Name);

     var method = methods.FirstOrDefault();
     if (method != null)
     {
        result = method.Invoke(null, args);
        return true;
     }

     result = null;
     return false;
  }
}


317
4
c#
задан 30 апреля 2011 в 05:04 Источник Поделиться
Комментарии
1 ответ

Порядок метода инфос возвращаются в дозе не появляются, чтобы быть определенными, я бы предложил фильтрации по типам аргументов, чтобы избежать риска все рассыпается в прах, когда порядок меняется.

Также вы можете рассмотреть случай, когда метод определяется как базовый класс и подкласс.

class A
{
public static void DoAwsomeStuff()
{
// really awsome stuff.
}
}

class B : A
{
public static void DoAwsomeStuff()
{
// different but still awsome stuff.
}
}

Скрывая статические методы, как это следует, вероятно, с неодобрением, но все же я бы посоветовал выбрать метод, наиболее точно объявляющего типа. Просто чтобы быть безопасным.

MethodInfo method = null;

foreach(var current in methods)
{
if(method == null || current.DeclaringType.IsAssignableFrom(method.DeclaringType))
{
method = current;
}
}


Редактировать:

Другой вариант стоит рассмотреть использование тип.Метод invokemember(). Это уже принимает типы аргументов и способ скрываясь в учетной записи.

try
{
result = _type.InvokeMember(
binder.Name,
BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy | BindingFlags.InvokeMethod,
null,
null,
args
);

return true;
}
catch(MissingMethodException)
{
result = null;
return false;
}

2
ответ дан 1 мая 2011 в 12:05 Источник Поделиться