У меня была та же проблема, и предыдущий ответ не работал для меня. Я открыл графический интерфейс VirtualBox и увидел, что виртуальная машина работает. Я остановил его, а затем я выполнил « бродяга вверх ». Все работало хорошо.
Каким типом интересуются Вы? Тип возврата метода/свойства/события и т.д.?
Если так, я не думаю, что существует что-либо в MemberInfo
, чтобы позволить Вам достигнуть его непосредственно - необходимо будет бросить и использовать MethodInfo.ReturnType
, PropertyInfo.PropertyType
, FieldInfo.FieldType
, EventInfo.EventHandlerType
и любые другие, которых я забыл. (Помните, что сами типы могут быть участниками. Не уверенный, что Вы захотите сделать с ними!)
РЕДАКТИРОВАНИЕ: Если Вы интересуетесь тем, представляет ли определенный тип или MyType или некоторый подкласс, то используйте Тип. IsAssignableFrom:
if (typeof(MyType).IsAssignableFrom(type))
РЕДАКТИРОВАНИЕ: Теперь, когда мы знаем, что Вы хотите свойства, это легко - используют GetProperties вместо GetMembers. Мне нравится делать отражение с 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);
}
, Если Вы не поклонник LINQ:
foreach (Type t in a.GetTypes())
foreach (PropertyInfo pi in t.GetProperties())
if (typeof(MyType).IsAssignableFrom(pi.PropertyType))
Console.WriteLine("Found a property that is MyType");
Примечание, что Вы могли бы хотеть указать обязательные флаги для получения непубличных свойств и т.д.
Существует несколько способов протестировать тип объекта:
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);
}
Хорошо, возможно, я пропускаю что-то глупое, но не был должен оно быть:
if ( pi.PropertyType == typeof(MyType ))
???
Вы ищете:
if (typeof(mi) is MyType) { ... }
право?
Я думаю, что Вам нужно что-то вроде этого:
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;
}
}