brahimcakal Ответов: 2

Как мы находим интерфейсы, которые включают интерфейсы?


I need to find classes that use the interface, and I need to access the properties within those classes. How can I follow a path? Thank you for your help.


using System.Drawing;

namespace HesapMakinesi.Interfaces
{
    public interface IHesaplama
    {
        byte Genişlik { get; set; }
        byte Yukseklik { get; set; }
        string Butonİsmi { get; set; }
        Color ButonRengi { get; set; }
        Color ButonİsimRengi { get; set; }
        int LocacationX { get; set; }
        int LocationY { get; set; }

        float Sayi1 { get; set; }
        float Sayi2 { get; set; }
        float IslemYap();
    }
}

  public class Toplama : IHesaplama
    {
        public float Sayi1 { get; set; }
        public float Sayi2 { get; set; }

        public byte Genişlik { get; set; }
        public byte Yukseklik { get; set; }
        public string Butonİsmi { get; set; }
        public Color ButonRengi { get; set; }
        public Color ButonİsimRengi { get; set; }
        public int LocacationX { get; set; }
        public int LocationY { get; set; }

        public Toplama()
        {
            Genişlik = 30;
            Yukseklik = 30;
            Butonİsmi = "+";
            ButonRengi = Color.Gray;
            ButonİsimRengi = Color.Black;
            LocacationX = 100;
            LocationY = 100;
        }
        
        public float IslemYap()
        {
            return Sayi1 + Sayi2;
        }
    }


There is a separate class in other operations, such as the aggregation class.

All of them have a common interface.

Well;


private void Form1_Load(object sender, EventArgs e)
       {

       }


What should I write between these blocks that all classes using the interface should be added to the automatic calculation machine.


Что я уже пробовал:

var result = new List<Type>();
            foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
            {
                foreach (var type in assembly.GetTypes())
                {
                    if (typeof(IHesaplama).IsAssignableFrom(type))
                    {
                        result.Add(type);
                    }
                }
            }


I tried this code but couldn't reach the classes using the interface.

2 Ответов

Рейтинг:
2

BillWoodruff

Пример использования:

var ifaces = (typeof(IYourInterface)).GetInterfaceImplementors();

// returns an IEnumerable of Interface implementors

public static class TypeExtensions
{
    public static IEnumerable<Type> GetInterfaceImplementors(this Type itype)
    {
        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            foreach (Type type in assembly.GetTypes())
            {
                if (itype.IsAssignableFrom(type) && ! type.IsInterface)
                {
                    yield return type;
                }
            }
        }
    }
}
Прямое использование Linq:
Type interfaceType = typeof(yourInterfaceName);

var implementors = AppDomain.CurrentDomain.GetAssemblies()
    // .Select(asm => asm) removed as suggested by Richard Deeming
    .SelectMany(typs => typs.GetTypes())
    .Where(typ => interfaceType.IsAssignableFrom(typ) && ! typ.IsInterface);


Afzaal Ahmad Zeeshan

5ед.

BillWoodruff

спасибо, Afzaal !

Richard Deeming

В вашем примере LINQ вам не нужен .Select(asm => asm) линия. :)

BillWoodruff

Спасибо, Ричард !

Рейтинг:
2

#realJSOP

Попробовать это:

var result = new List<Type>();
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
    foreach (var type in assembly.GetTypes())
    {
        if (type is IHesaplama)
        {
            result.Add(type);
        }
    }
}


BillWoodruff

Вы пробовали это скомпилировать и использовать ?

Смотрите: https://stackoverflow.com/a/26768/133321

#realJSOP

Нет, это было не в моей голове, и я был в системе Linux, которая не имела (monodevelop на ней), когда я ответил.

BillWoodruff

Я бы сказал, что это довольно редкий случай, когда что-то с вашей макушки не попадает в точку :) Ваш код, как есть, никогда не найдет соответствия.

#realJSOP

как только я попал в окно windows, я написал очень простое консольное приложение (определил объект интерфейса, унаследовал от него, а затем di "is ...", и в этом случае оно сработало. Однако я не получил типы сборок.

BillWoodruff

Привет, Джон, возможно, вы видите " это работа с экземпляром типа ... но здесь, имхо, проблема заключается в том, чтобы найти типы, а не экземпляры (?)

#realJSOP

Я думал, что он хочет получить список всех классов, полученных из его интерфейса.