如何判断一个类是从另一个泛型类上面继承的?

张天星 2020-12-16 10:34:24

/// <summary>
/// 泛型类
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public interface IClass<TEntity> where TEntity : class { }

public class Entity { }

public class ClassEntity
{
//如何知道这个Data的类型,是IClass
public IClass<Entity> Data { get; set; }
public string Str { get; set; }
}

class Program
{
static void Main(string[] args)
{
//如何判断ClassEntity中哪些属性是IClass的
var entityType = typeof(ClassEntity);
var props = entityType.GetProperties();
//下面是我自己的写法,感觉有些麻烦,不知道有没有简单的办法
foreach (var prop in props)
{
var typeArgs = prop.PropertyType.GenericTypeArguments;
if (typeArgs.Count() == 1)
{
var arg = typeArgs.Single();
var tableType = typeof(IClass<>).MakeGenericType(arg);
if (tableType.IsAssignableFrom(prop.PropertyType))
{
Console.WriteLine($"PropName={prop.Name}");
}

}
}
Console.ReadLine();
}
}

...全文
13841 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
张天星 2020-12-20
  • 打赏
  • 举报
回复
引用 7 楼 张天星 的回复:
标题想问的是另一个问题:

public interface IService<TEntity> where TEntity : class { }
public class BookService : IService<Book>{}
public class FileService : IService<File>{}
如何找出IService<TEntity>的继承类,我在部分DI和AOP中会用到,我自己的实现,也是和问题中差不多,将实体和接口重新组合成一个Type之后进行比对。 所以想知道,有没有可以直接比对的办法。
或者这不叫继承,这叫实现一个接口?基础不够扎实,我也不知道这应该怎么描述,但大概是这个意思。
张天星 2020-12-20
  • 打赏
  • 举报
回复
标题想问的是另一个问题:

public interface IService<TEntity> where TEntity : class { }
public class BookService : IService<Book>{}
public class FileService : IService<File>{}
如何找出IService<TEntity>的继承类,我在部分DI和AOP中会用到,我自己的实现,也是和问题中差不多,将实体和接口重新组合成一个Type之后进行比对。 所以想知道,有没有可以直接比对的办法。
张天星 2020-12-20
  • 打赏
  • 举报
回复
引用 5 楼 以专业开发人员为伍 的回复:
越是因设计大系统而需要设计众多类型(包括接口)的人,越懂得要少设计新类型(新接口)的知识,这样才能准确设计。你可以看到任何程序都是这样,滥用技术的人反而纠结技术而不是真正应用技术。越是懂得技术广泛应用的人,越懂得如何少用技术。
。。应该怎么说。。我问的是需求,是实现,不是纠结或者说滥用技术。 标题和正文其实有些不一致,标题我后续重新询问吧,就不去扯那个了。 正文的问题,就是一个需求: 有一个类,类中有多个公共属性。 怎么将这些公共属性中,同一个泛型类的实现找出来?(确实不是继承,所以我说,标题和正文不一样,是我的错)

public interface IList<TEntity> where TEntity : class { }
public interface BaseList<TEntity> : IList<TEntity> where TEntity : class { }
public class ClassEntity
    {
        public BaseList<File> Data { get; set; }
        public BaseList<Book> Data1 { get; set; }
        public BaseList<Folder> Data2 { get; set; }
        public string Str { get; set; }
    }
怎么从这里面找出Data/Data1/Data2
  • 打赏
  • 举报
回复
越是因设计大系统而需要设计众多类型(包括接口)的人,越懂得要少设计新类型(新接口)的知识,这样才能准确设计。你可以看到任何程序都是这样,滥用技术的人反而纠结技术而不是真正应用技术。越是懂得技术广泛应用的人,越懂得如何少用技术。
  • 打赏
  • 举报
回复
即使是 A 继承 B,那么 IClass<A> 跟 IClass<B> 也没有继承关系。你对于泛型的理解有误。

我们使用接口、Class当然是也少类型越好,为什么要为了技术而技术呢?仅当必要时才设计出来新的 Class或者 interface,不要“过分技术化”了!

例如明明是你让 A 和 B 类都实现 IC 接口,并且你的工具属性针对 public IC Data { get; set; } 就够能处理各类扩展了,你偏要扯上泛型、A和B,这不就是本末倒置么?

如果人性过度偏技术化,技术越多越反动。
bloodish 2020-12-17
  • 打赏
  • 举报
回复

var entityType = typeof(ClassEntity);
var props = entityType.GetProperties();
var ret = props.Where(p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition().IsAssignableFrom(typeof(IClass<>))).ToList();
Denuin 2020-12-17
  • 打赏
  • 举报
回复
不麻烦,能实现就好了

var entityType = typeof(ClassEntity);
var props = entityType.GetProperties();
var q = props.Where(x => x.PropertyType.Name.Contains("IClass"));
foreach (var p in q)
{
	Console.WriteLine($"PropName={p.Name}");
}
enaking 2020-12-17
  • 打赏
  • 举报
回复
var entityType = typeof(ClassEntity); var props = entityType.GetProperties(); var q = props.Where(x => x.PropertyType.Name.Contains("IClass")); foreach (var p in q) { Console.WriteLine($"PropName={p.Name}"); }

110,561

社区成员

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

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

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