当前位置: 代码迷 >> C# >> C#接口作为函数参数,其后输出接口所有成员名(类名)
  详细解决方案

C#接口作为函数参数,其后输出接口所有成员名(类名)

热度:181   发布时间:2016-05-05 05:24:50.0
C#接口作为函数参数,然后输出接口所有成员名(类名)

这是他的答案:

感觉这个答案不太好因为接口已经连接了那四个成员,这里还用四行代码特意加上去,感觉非常不好。
我想问能不能写一个函数,参数是接口名,然后代码实现输出显示支持这个接口所有的成员名(类名)?如果不能有什么其他方法比这个例题答案好一点的方法?
------解决思路----------------------
它这是教学,不是实际问题,要是不这样写,可能就会有人看不懂了。

你是想获取所有实现了这个接口的类名,那就用反射,比如下面代码就是显示指定类型所在程序集中的可以被作为指定类型使用的具体类型的全名,不过这和那个题不是一个意思。

public static void ShowImpl<T>()
{
    var type = typeof(T);
    foreach (var t in type.Assembly.GetTypes().Where(t => !t.IsAbstract && type.IsAssignableFrom(t)))
    {
        Console.WriteLine(t.FullName);
    }
}

ShowImpl<IPassengerCarrier>();

和题目差不多一个意思的方式是获取具体类型后,创建它的实例,再调用实例的ToString方法(用了点特别的方式):

public static void ShowImpl2<T>(Action<T> action)
{
    var type = typeof(T);
    foreach (var v in type.Assembly.GetTypes().Where(t => !t.IsAbstract && type.IsAssignableFrom(t)).Select(t => t.GetConstructor(Type.EmptyTypes)).Where(ci => ci != null).Select(ci => Expression.Lambda<Func<T>>(Expression.New(ci)).Compile()()))
    {
        action(v);
    }
}

ShowImpl2<IPassengerCarrier>(v => Console.WriteLine(v.ToString()));
  相关解决方案