[英]Getting certain types in a namespace
namespace BaseNameSpace
{
public class BaseClass
{
public virtual string ClassName()
{
return "BaseClass";
}
}
}
...
namespace MyNameSpace
{
public class Class1: BaseClass
{
public override string ClassName()
{
return "ClassName1";
}
}
public class Class2: BaseClass
{
public override string ClassName()
{
return "ClassName2";
}
}
//.... similar classes follow .... ->
}
是否可以僅基於ClassName-property獲得名稱空間中的某些類型? 例如,我只想要“ ClassName1”,而不想要其他。
Type[] types = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.NameSpace.Equals("MyNamespace"))
.ToArray<Type>();
理想情況下,您應該使用屬性來裝飾類並使用該屬性過濾類型,如下所示。
[AttributeUsage(AttributeTargets.Class)]
public class NameAttribute : Attribute
{
public NameAttribute(string name)
{
Name = name;
}
public string Name { get; private set; }
}
[Name("Class1")]
public class SomeClass
{
}
現在,您可以使用以下代碼過濾類型。
var filteredTypes = yourAssembly.GetTypes().Where(type =>
{
var nameAttrib = type.GetCustomAttribute<NameAttribute>();
return nameAttrib != null && "Class1".Equals(nameAttrib.Name);
});
但是,如果名稱在編譯時未知,但在運行時可用,則應將ClassName()
方法ClassName()
靜態。 然后,您可以按以下方式對其進行過濾。
var filteredTypes = yourAssembly.GetTypes().Where(type =>
{
var method = type.GetMethod("ClassName", BindingFlags.Static);
return method != null && "Class1".Equals(method.Invoke(null, null));
});
嘗試這個:
Type[] types = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.Namespace.Equals("MyNamespace") && t.Name=="Class1")
.ToArray<Type>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.