C #: необязательный метод - PullRequest
       92

C #: необязательный метод

3 голосов
/ 28 октября 2009

У меня есть объект, который реализует интерфейс. Я хочу вызвать метод объекта, если он реализован. Как лучше всего это сделать?

Обновление Некоторые из вас упоминали, что мой вопрос был неопределенным. Извини за это. Когда я сказал «если он реализован», я имел в виду «если он вызывается». Спасибо за ваши ответы и усилия, ребята (или девушки!). Я поражен тем, сколько поддержки разработчиков есть на этом сайте.

Ответы [ 12 ]

0 голосов
/ 28 октября 2009

В зависимости от того, как вы ссылаетесь на объект, некоторые члены будут видны. Интерфейс может быть неявно определен или явно определен, или может быть реализован производным классом, и вы используете ссылку на базовый класс. Другими словами, не всегда сразу видны все доступные элементы объекта.

Таким образом, если вы хотите протестировать реализацию определенного интерфейса (ISomething) вашим объектом (yourObj), один из вариантов - это проверить тип данных, используя отражение. Основываясь на результатах этого теста, вы можете явно привести реализующий объект в интерфейс типа и использовать его члены ...

if (yourObj is ISomething)
     ((ISomething)yourObj).DoSomething();

Это то же самое, что сделано другим способом (более "многословно" при использовании вызовов методов):

if (typeof(ISomething).IsAssignableFrom(yourObj.GetType()))
    ((ISomething)yourObj).DoSomething();

В этом примере предполагается, что интерфейс ISomething определен как:

public interface ISomething {
    void DoSomething();
    // other members ...
}

Таким образом, этот код говорит: если интерфейс ISomething Is-Assignable-From ваш объект выбора, то ваш объект реализует этот интерфейс и, следовательно, имеет эти открытые члены.

0 голосов
/ 28 октября 2009

Не знаю, возможно, вы ищете что-то подобное. При этом используется атрибут, с помощью которого вы можете пометить метод, независимо от того, реализован он или нет. Затем я добавил метод расширения в интерфейс, чтобы проверить, реализован ли этот метод. Наконец, код позволит вам спросить объект, реализован ли метод. Мне это не нравится, но это может быть то, что вы ищете.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication1
{
    public static class Program
    {
        static void Main(string[] args)
        {
            EmployeeA empA = new EmployeeA();

            if (empA.IsImplemented("TestMethod"))
                empA.TestMethod();

            EmployeeB empB = new EmployeeB();
            if (empB.IsImplemented("TestMethod"))
                empB.TestMethod();


            Console.ReadLine();

        }

        public static bool IsImplemented(this IEmp emp, string methodName)
        {
            ImplementedAttribute impAtt;
            MethodInfo info = emp.GetType().GetMethod(methodName);
            impAtt = Attribute.GetCustomAttribute(info, typeof(ImplementedAttribute), false)
                        as ImplementedAttribute;

            return (impAtt == null) ? true : impAtt.Implemented;

        }

    }

    public class EmployeeA : IEmp
    {
        #region IEmp Members

        [Implemented(false)]
        public void  TestMethod()
        {
            Console.WriteLine("Inside of EmployeeA");
        }

        #endregion
    }

    public class EmployeeB : IEmp
    {
        #region IEmp Members

        [Implemented(true)]
        public void TestMethod()
        {
            Console.WriteLine("Inside of EmployeeB");
        }

        #endregion
    }


    public class ImplementedAttribute : Attribute
    {
        public bool Implemented { get; set; }

        public ImplementedAttribute():this(true)
        {
        }

        public ImplementedAttribute(bool implemented)
        {
            Implemented = implemented;
        }
    }

    public interface IEmp
    {
        void TestMethod();
    }

}

РЕДАКТИРОВАТЬ: После того, как первоначальный автор перефразировал вопрос, вам определенно нужно реализовать интерфейс, гарантирующий, что метод существует. Я оставлю приведенный выше код для любопытства.

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