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

u011001815 2014-12-20 09:01:29

这是他的答案:

感觉这个答案不太好因为接口已经连接了那四个成员,这里还用四行代码特意加上去,感觉非常不好。
我想问能不能写一个函数,参数是接口名,然后代码实现输出显示支持这个接口所有的成员名(类名)?如果不能有什么其他方法比这个例题答案好一点的方法?
...全文
400 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2014-12-21
  • 打赏
  • 举报
回复
接口是给编译器用的,要是运行时获取有什么方法,就不一定要用接口了。你都得到方法了,还要接口干嘛。
wjq 2014-12-21
  • 打赏
  • 举报
回复
它这个例子要说不好的地方,就是接口应该提供一个方法,比如输出相应车型实际特性的(名称/前后四驱/厂商等)然后调用这个方法,而不是与接口无关的ToString方法。
wjq 2014-12-21
  • 打赏
  • 举报
回复
他这是教你接口有什么作用,不是实际用法。 告诉你接口作为一种约束,在继承相关接口的类里可以有额外其他属性/方法等。
winnowc 2014-12-20
  • 打赏
  • 举报
回复
它这是教学,不是实际问题,要是不这样写,可能就会有人看不懂了。 你是想获取所有实现了这个接口的类名,那就用反射,比如下面代码就是显示指定类型所在程序集中的可以被作为指定类型使用的具体类型的全名,不过这和那个题不是一个意思。

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()));
u011001815 2014-12-20
  • 打赏
  • 举报
回复
求大神!!!!

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧