簡體   English   中英

在名稱空間中獲取某些類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM