我的项目中有一个派生类的泛型类.
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)
不起作用.
假设我有一个类型MyType.我想做以下事情:
看起来这样做的方法是GetInterface(),但这只允许您按特定名称进行搜索.有没有办法搜索"IList形式的所有接口"(如果可能的话,如果接口是IList的子接口,它也会有用.)
说我有以下课程:
public class General<T> { }
Run Code Online (Sandbox Code Playgroud)
我想知道一个对象是否属于那种类型.我知道我可以使用反射来找出该对象是否属于该泛型类型Type.GetGenericTypeDefinition
,但我想避免这种情况.
是否有可能做某事obj is General<T>
,或obj.GetType().IsAssignableFrom(typeof(General<T>))
?
我很惊讶我找不到类似的问题,尽管我在搜索中可能使用了错误的关键字.
我试图检查一个类型是否实现了通用ICollection <T>接口,因为这是我的任何通用集合的基本接口.
以下代码不起作用
GetType(ICollection(Of)).IsAssignableFrom(
objValue.GetType().GetGenericTypeDefinition())
Run Code Online (Sandbox Code Playgroud)
检测类型是否实现通用接口的好方法是什么?
我的第一个目标是使用泛型基于特定接口过滤类型.
我的第二个目标是获取泛型参数本身的类型.
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.
提前致谢!
让我们说我宣布以下内容
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?
关注这个问题,为什么会enumerable
这样:
Type type = typeof(List<string>);
bool enumerable = (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>));
Run Code Online (Sandbox Code Playgroud)
回来false
?
由于上述方法不起作用,确定类是否实现IEnumerable的最佳方法是什么?
我有那个界面:
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?
谢谢
我有多个类(简化用于解释目的):
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# ×8
.net ×4
generics ×4
reflection ×4
types ×3
ienumerable ×1
interface ×1
linq ×1
list ×1
vb.net ×1