.Net Reflection - Вызов несуществующих методов - PullRequest
0 голосов
/ 20 апреля 2010

Допустим, я вызываю метод M1 в классе A, используя отражение. Метод не существует.

Есть ли способ поместить обработчик в класс A, который говорит: «кто-то пытается выполнить метод M1»?

Или

Можно ли динамически добавить метод в класс? Я хочу добавить метод M1 ... Mn, который всегда выполняет MyStaticClass.DoAction ("M1 ... Mn");

Что-то вроде:

string methodName = "M1".

A.AddMethod (имя метода, x => MyStaticClass.DoAction (x));

Ответы [ 2 ]

1 голос
/ 20 апреля 2010

На самом деле в C # 4.0 существует действительно простой способ сделать это ... не знаю, какую платформу вы используете.

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

class DynamicTester : DynamicObject
{
    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        Console.WriteLine("Someone is calling method {0}", binder.Name); result = null; return true;
    }
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        Console.WriteLine("Someone is trying to get attribute {0}", binder.Name); result = null; return true;
    }
    public override bool TrySetMember(SetMemberBinder binder, object value) 
    {
        Console.WriteLine("Someone is trying to set attribute {0} to value {1}", binder.Name, Convert.ToString(value)); return true;
    }
}
class Program
{
    static void Main(string[] args)
    {
        dynamic dt = new DynamicTester();
        dt.A = "Test"; dt.B = 14; dt.date = DateTime.Now;
        var i = dt.Z;
        dt.Tester(1, 2, 3);
    }
}

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

значительно упрощает весь рефакторинг, который должен был быть сделан ранее.

1 голос
/ 20 апреля 2010

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

...