Список классов универсальных имен интерфейсов - PullRequest
0 голосов
/ 05 января 2012

У меня есть этот код c #;

case "Cafe":
  source.trendItem = new TrendingLocation<ITrendingCafe>();
  break;
case "Pub":
  source.trendItem = new TrendingLocation<ITrendingPub>();
  break;
etc

a trendItem определяется следующим образом;

public class TrendingItem<T> where T : ITrendingItem
{
    public T trendItem { get; set; }
}

Тогда у меня есть это;

public List<TrendingItem<ITrendingItem>> trendItems { get; set; }

Теперь для каждого элемента в вышеуказанных элементах TrendItems я хочу получить интерфейсы.

Я пытался использовать;

string g = fvm.trendItems[4].trendItem.GetType().GetInterfaces()[1].Name;

и

string g = typeof(TrendingLocation<>).GetInterfaces()[0].Name;

, но ни один из этих списков не показываетУниверсальный интерфейс, такой как ITrendingCafe, ITrendingRestaurant и т. Д.

Есть ли способ узнать имя универсального имени интерфейса?

Ответы [ 2 ]

1 голос
/ 05 января 2012

Вы хотите использовать метод GetGenericArguments типа.

Если я понимаю вашу структуру, это будет что-то вроде:

Type[] typeArguments = fvm.trendItems[4].trendItem.GetType().GetGenericArguments();

foreach (Type tParam in typeArguments)
{
    // Compare the type with the interface you are looking for.
}
0 голосов
/ 05 января 2012

Я так понимаю, ITrendingCafe - это интерфейс, который реализует ITrendingItem.Я написал быструю программу, которая принимает и отображает все интерфейсы, которые T реализует:

using System;
using System.Collections.Generic;

namespace TestConsoleApplication
{
    public interface ITrendingItem
    {
        string ItemName { get; set; }
    }

    public interface ITrendingCafe : ITrendingItem
    {
        string CafeName { get; set; }
    }


    public class TrendingItem<T> where T : ITrendingItem
    {
        public T trendItem { get; set; }
    }

    public class Cafe : ITrendingCafe
    {
        public string ItemName { get; set; }
        public string CafeName { get; set; }
    }


    class Program
    {
        static void Main(string[] args)
        {
            var test = new List<TrendingItem<ITrendingItem>> { new TrendingItem<ITrendingItem> { trendItem = new Cafe() } };

            foreach (var trendingItem in test[0].trendItem.GetType().GetInterfaces())
            {
                Console.Out.WriteLine(trendingItem.Name);
            }
            Console.ReadKey();
        }
    }
}

И вот вывод:

enter image description here

AsВы можете видеть, интерфейс есть.Просто прокрутите и найдите тот, который вам нужен!

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