如何测试类型的属性以查看它是否为指定类型?
编辑:我的目标是检查一个程序集,看看该程序集中的任何类型是否包含MyType属性(或从MyType继承)。
这是我走下去的赛道......
AssemblyName n = new AssemblyName();
n.CodeBase = "file://" + dllName;
Assembly a = AppDomain.CurrentDomain.Load(n);
foreach (Type t in a.GetTypes())
foreach (PropertyInfo pi in t.GetProperties())
if ( pi.PropertyType is MyType ) // warning CS0184
Console.WriteLine("Found a property that is MyType");
这会编译警告CS0184:给定的表达式永远不是提供的('MyType')类型
答案 0 :(得分:56)
您对哪种类型感兴趣?方法/属性/事件等的返回类型?
如果是这样,我认为MemberInfo
中没有任何内容可以让您直接使用它 - 您需要投射并使用MethodInfo.ReturnType
,PropertyInfo.PropertyType
,{{1 }},FieldInfo.FieldType
以及我忘记的任何其他人。 (请记住,类型本身可以是成员。不确定你想用它们做什么!)
编辑:如果您对特定类型是代表MyType还是某些子类感兴趣,请使用Type.IsAssignableFrom:
EventInfo.EventHandlerType
编辑:现在我们知道你想要属性,这很容易 - 使用GetProperties而不是GetMembers。我喜欢用LINQ做反思:
if (typeof(MyType).IsAssignableFrom(type))
如果你不是LINQ的粉丝:
var query = from type in assembly.GetTypes()
from property in type.GetProperties()
where typeof(MyType).IsAssignableFrom(property.PropertyType)
select new { Type=type, Property=property };
foreach (var entry in query)
{
Console.WriteLine(entry);
}
请注意,您可能希望指定绑定标志以获取非公共属性等。
答案 1 :(得分:48)
好吧,也许我错过了一些愚蠢的东西,但不应该是:
if ( pi.PropertyType == typeof(MyType ))
???
答案 2 :(得分:2)
有多种方法可以测试对象的类型:
1)使用是运算符:
if (anObject is MyType) {
// anObject is MyType or a derived class
...
}
2)使用作为运算符:
MyType newObject = anObject as MyType;
if (newObject != null ) {
// newObject is anObject cast to MyType
...
}
3)使用typeof()和GetType()[3个变种]:
// #1
if (typeof(MyType) == anObject.GetType()) {
// anObject is a MyType
...
}
//#2
public static bool IsType(object obj, string type)
{// modified from Visual C# 2005 Recipes {Apress}
// Get the named type, use case-insensitive search, throw
// an exception if the type is not found.
Type t = Type.GetType(type, true, true);
return t == obj.GetType();
}
//#3
public static bool IsTypeOrSubclass(object obj, string type)
{// modified from Visual C# 2005 Recipes {Apress}
// Get the named type, use case-insensitive search, throw
// an exception if the type is not found.
Type t = Type.GetType(type, true, true);
return t == obj.GetType() || obj.GetType().IsSubclassOf(t);
}
答案 3 :(得分:1)
我认为你需要这样的东西:
using System;
using System.Reflection;
namespace ConsoleApplication1{
class Class1{
static bool checkType(Type propertyType,Type myType){
if (propertyType == myType){
return true;
}
Type test = propertyType.BaseType;
while (test != typeof(Object)){
if (test == myType){
return true;
}
test = test.BaseType;
}
return false;
}
[STAThread]
static void Main(string[] args){
Assembly a = Assembly.GetExecutingAssembly();
foreach (Type t in a.GetTypes()){
Console.WriteLine("Type: {0}",t.Name);
foreach (PropertyInfo p in t.GetProperties()){
if (checkType(p.PropertyType,typeof(MyType))){
Console.WriteLine(" Property: {0}, {1}",p.Name,p.PropertyType.Name);
}
}
}
}
}
class MyType{
}
class MyType2 : MyType{
}
class TestType
{
public MyType mt{
get{return _mt;}
set{_mt = value;}
}
private MyType _mt;
public MyType2 mt2
{
get{return _mt2;}
set{_mt2 = value;}
}
private MyType2 _mt2;
}
}
答案 4 :(得分:1)
您正在寻找:
if (typeof(mi) is MyType) { ... }
对吧?
答案 5 :(得分:1)
这个来自其他类似问题的例子简化了对我的理解
If p.PropertyType Is GetType(String) Then
答案 6 :(得分:0)
在比较具有明确书写类型的事物的实例时,您应该使用is
:
Department sales = new Department("Sales");
Debug.Assert(sales is Department);
如果要比较两种类型,则应使用typeof,并且无法明确写入类型:
private void CheckType(Type t)
{
Debug.Assert(typeof(Department) == t);
}
使用is
会考虑继承,typeof
不会。
public class Animal { }
public class Dog : Animal { }
public void Test()
{
Dog d = new Dog();
Debug.Assert(d is Animal); // true
Debug.Assert(typeof(Dog) == typeof(Animal); // false
}
如果您想比较两种类型并考虑继承性,可以使用IsAssignableFrom
:
Debug.Assert(typeof(Animal).IsAssignableFrom(typeof(Dog))); // true
答案 7 :(得分:0)
这是捷径
property.PropertyType.IsGenericType && (typeof(ICollection<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition()))
&& typeof(<YourType>).IsAssignableFrom(property.PropertyType.GenericTypeArguments[0])