Задать вопрос
@Alexveto

Почему нельзя вызывать методы объекта через свойство делегата Target?

Если есть делегат которому присвоили какой-нибудь НЕстатический метод объекта:
SomeClass someObject = new SomeClass();
SomeDelegate someDelegate = someObject.SomeNonStaticMethod;

То такой вывод даст true
Console.WriteLine(someDelegate.Target == someObject);

Тогда почему нельзя делать так?
someObject.SomeMethod();
someDelegate.Target.SomeMethod(); // а вот так почему-то нельзя
  • Вопрос задан
  • 65 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
freeExec
@freeExec
Участник OpenStreetMap
Приведи Target к его типу SomeClass, и тогда будет можно.
Ответ написан
Комментировать
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
можно
using System;

namespace SomeNonStatic
{
    class Program
    {
        delegate void someDelegate();
        static void Main(string[] args)
        {
            var so = new SomeClass();
            someDelegate sd = so.SomeNonStaticMethod;

            Console.WriteLine($"someDelegate.Target == someObject => {sd.Target == so}");

            (sd.Target as SomeClass).SomeMethod(); // а вот так почему-то нельзя
        }
    }

    internal class SomeClass
    {
        internal void SomeNonStaticMethod() => Console.WriteLine("it's SomeNonStaticMethod");
        internal void SomeMethod() => Console.WriteLine("it's SomeMethod");
    }
}
а еще лучше так
using System;

namespace SomeNonStatic
{
    class Program
    {
        delegate void someDelegate();
        static void Main(string[] args)
        {
            var so = new SomeClass();
            someDelegate sd = so.SomeNonStaticMethod;

            Console.WriteLine($"someDelegate.Target == someObject => {sd.Target == so}");

            if(sd.Target.GetType() is SomeClass)
                (sd.Target as SomeClass).SomeMethod(); // а вот так почему-то нельзя
        }
    }

    internal class SomeClass
    {
        internal void SomeNonStaticMethod() => Console.WriteLine("it's SomeNonStaticMethod");
        internal void SomeMethod() => Console.WriteLine("it's SomeMethod");
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы