我有这个c#代码;
case "Cafe":
source.trendItem = new TrendingLocation<ITrendingCafe>();
break;
case "Pub":
source.trendItem = new TrendingLocation<ITrendingPub>();
break;
etc
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等。
有没有办法可以获得通用接口名称的名称?
答案 0 :(得分:1)
您想使用Type的GetGenericArguments方法。
如果我理解你的结构,它将是:
Type[] typeArguments = fvm.trendItems[4].trendItem.GetType().GetGenericArguments();
foreach (Type tParam in typeArguments)
{
// Compare the type with the interface you are looking for.
}
答案 1 :(得分:0)
我认为ITrendingCafe
是一个实现ITrendingItem
的接口。我写了一个快速程序,它接受并显示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();
}
}
}
这是输出:
如您所见,界面就在那里。只需循环找到你需要的那个!