相关疑难解决方法(0)

检查类是否派生自泛型类

我的项目中有一个派生类的泛型类.

public class GenericClass<T> : GenericInterface<T>
{
}

public class Test : GenericClass<SomeType>
{
}
Run Code Online (Sandbox Code Playgroud)

有没有办法找出一个Type对象是否来自GenericClass

t.IsSubclassOf(typeof(GenericClass<>))
Run Code Online (Sandbox Code Playgroud)

不起作用.

c# generics reflection

287
推荐指数
11
解决办法
14万
查看次数

找出类型是否实现了通用接口

假设我有一个类型MyType.我想做以下事情:

  1. 找出MyType是否为某些T实现了IList接口.
  2. 如果(1)的答案为是,请找出T是什么.

看起来这样做的方法是GetInterface(),但这只允许您按特定名称进行搜索.有没有办法搜索"IList形式的所有接口"(如果可能的话,如果接口是IList的子接口,它也会有用.)

相关:如何确定类型是否实现特定的通用接口类型

.net c# reflection

54
推荐指数
2
解决办法
2万
查看次数

在C#中检查对象是否是非特定泛型类型

说我有以下课程:

public class General<T> { }
Run Code Online (Sandbox Code Playgroud)

我想知道一个对象是否属于那种类型.我知道我可以使用反射来找出该对象是否属于该泛型类型Type.GetGenericTypeDefinition,但我想避免这种情况.

是否有可能做某事obj is General<T>,或obj.GetType().IsAssignableFrom(typeof(General<T>))

我很惊讶我找不到类似的问题,尽管我在搜索中可能使用了错误的关键字.

.net c# generics types

11
推荐指数
1
解决办法
4573
查看次数

检测类型是否实现ICollection <T>

我试图检查一个类型是否实现了通用ICollection <T>接口,因为这是我的任何通用集合的基本接口.

以下代码不起作用

GetType(ICollection(Of)).IsAssignableFrom(
    objValue.GetType().GetGenericTypeDefinition())
Run Code Online (Sandbox Code Playgroud)

检测类型是否实现通用接口的好方法是什么?

.net c# vb.net reflection

7
推荐指数
1
解决办法
5192
查看次数

如何反映具有泛型接口的类型,并获得该类型的泛型

我的第一个目标是使用泛型基于特定接口过滤类型.

我的第二个目标是获取泛型参数本身的类型.

public UserService : IUserService, IDisposable, IExportableAs<IUserService>
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

我不能假设类的结构,它的接口(如果有的话)或类似的.我知道的唯一一件事就是我ExportableAs<T>用来创建这个插件的共享程序集.但是,我需要动态注册该类型.

所以,我使用通用接口来标记要导出的类型.在这种情况下,它是IUserService.我这样做假设一些漂亮的Linq查询可以给我我想要的东西.但是,我有点麻烦.

这是我到目前为止所拥有的:

assembly.GetTypes()
    .Where(t => t.GetInterfaces().Any(i => 
                i.IsGenericType &&
                i.GetGenericTypeDefinition() == typeof(IExportableAs<>))
            ).ToList()
    .ForEach(t => _catalogs.Add(
            new ComposablePart()
            {
                Name = t.FullName,
                Type = t // This is incorrect
            })
        );
Run Code Online (Sandbox Code Playgroud)

这是有效的,但请注意上面的评论"这是不正确的".这种类型是派生类UserService.

我最终的结果是:

  • 泛型类型传入IExportableAs<T>(IUserService在这种情况下)
  • 派生类类型(在本例中为UserService)

这个问题得到了很好的投票,因为它使我接近(如上所示):如何确定类型是否实现了特定的通用接口类型 但是,我需要更进一步找到该泛型类型.

随意修改上面的linq.

提前致谢!

linq generics types

5
推荐指数
1
解决办法
385
查看次数

如何确定对象是否实现任何类型的IDictionary或IList

让我们说我宣布以下内容

Dictionary<string, string> strings = new Dictionary<string, string>();
List<string> moreStrings = new List<string>();

public void DoSomething(object item)
{
   //here i need to know if item is IDictionary of any type or IList of any type.
}
Run Code Online (Sandbox Code Playgroud)

我尝试过使用:

item is IDictionary<object, object>
item is IDictionary<dynamic, dynamic>

item.GetType().IsAssignableFrom(typeof(IDictionary<object, object>))
item.GetType().IsAssignableFrom(typeof(IDictionary<dynamic, dynamic>))

item is IList<object>
item is IList<dynamic>

item.GetType().IsAssignableFrom(typeof(IList<object>))
item.GetType().IsAssignableFrom(typeof(IList<dynamic>))
Run Code Online (Sandbox Code Playgroud)

所有这些都是假的!

那么我如何确定(在此上下文中)项目实现IDictionary或IList?

.net c#

5
推荐指数
2
解决办法
2991
查看次数

在List <T>中查找IEnumerable <T>时,GetGenericTypeDefinition返回false

关注这个问题,为什么会enumerable这样:

Type type = typeof(List<string>);
bool enumerable = (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>));
Run Code Online (Sandbox Code Playgroud)

回来false


编辑1

由于上述方法不起作用,确定类是否实现IEnumerable的最佳方法是什么?

c# reflection ienumerable list

4
推荐指数
2
解决办法
2023
查看次数

检查我的对象是否在C#中实现了通用接口

我有那个界面:

public interface IEntityWithTypedId<T>{}
Run Code Online (Sandbox Code Playgroud)

并有两个类:

public abstract class EntityWithTypedId<TId> : IEntityWithTypedId<TId>{...}
public abstract class Entity : EntityWithTypedId<int>{...}    
Run Code Online (Sandbox Code Playgroud)

所以我有这样的实体:

public class TestA : Entity
public class TestB : EntityWithTypedId<string>
public class TestC : EntityWithTypedId<byte>
Run Code Online (Sandbox Code Playgroud)

如何检查我的实体是否实现了IEntityWithTypedId?

谢谢

c#

3
推荐指数
1
解决办法
239
查看次数

检查对象是否实现特定的通用接口

我有多个类(简化用于解释目的):

public class A : BaseClass,
    IHandleEvent<Event1>,
    IHandleEvent<Event2>
{
}

public class B : BaseClass,
    IHandleEvent<Event3>,
    IHandleEvent<Event4>
{
}

public class C : BaseClass,
    IHandleEvent<Event2>,
    IHandleEvent<Event3>
{
}
Run Code Online (Sandbox Code Playgroud)

在我的"BaseClass"中,我有一个方法,我想检查Child-class是否实现IHandleEvent了特定事件.

public void MyMethod()
{
    ...
    var event = ...;
    ...
    // If this class doesn't implement an IHandleEvent of the given event, return
    ...
}
Run Code Online (Sandbox Code Playgroud)

这个SO答案我知道如何检查对象是否实现了通用接口(implements IHandleEvent<>),如下所示:

if (this.GetType().GetInterfaces().Any(x =>
    x.IsGenericType && x.GenericTypeDefinition() == typeof(IHandleEvent<>)))
{
    ... // Some log-text
    return;
}
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何检查对象是否实现了SPECIFIC通用接口(implements IHandleEvent<Event1>).那么,如何在if中检查?

c# generics implementation types interface

0
推荐指数
1
解决办法
1060
查看次数

标签 统计

c# ×8

.net ×4

generics ×4

reflection ×4

types ×3

ienumerable ×1

implementation ×1

interface ×1

linq ×1

list ×1

vb.net ×1