griegs
griegs

Reputation: 22770

List a classes generic interface names

I have this c# code;

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

a trendItem is defined like this;

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

Then I have this;

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

Now for each item in the above trendItems i want to get the interfaces.

I tried using;

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

and

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

but neither of these lists the Generic interface such as ITrendingCafe, ITrendingRestaurant etc.

Is there a way I can get the name of the generic interface name?

Upvotes: 0

Views: 207

Answers (2)

joe_coolish
joe_coolish

Reputation: 7259

I take it that ITrendingCafe is an interface that implements ITrendingItem. I wrote a quick program that takes and displays all of the interfaces that T Implements:

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();
        }
    }
}

And here is the output:

enter image description here

As you can see, the interface is there. Just loop through and find the one you need!

Upvotes: 0

competent_tech
competent_tech

Reputation: 44941

You want to use the Type's GetGenericArguments method.

If I understand your structure, it will be something like:

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

foreach (Type tParam in typeArguments)
{
    // Compare the type with the interface you are looking for.
}

Upvotes: 1

Related Questions