C # Yansıma: Dizeden sınıf başvurusu nasıl alınır?


92

Bunu C # ile yapmak istiyorum ama nasıl yapacağımı bilmiyorum:

Sınıf adı -eg olan bir dizem var FooClassve bu sınıfta bir (statik) yöntemi çağırmak istiyorum:

FooClass.MyMethod();

Açıkçası, yansıtma yoluyla sınıfa bir referans bulmam gerekiyor, ama nasıl?

Yanıtlar:


127

Type.GetTypeYöntemi kullanmak isteyeceksiniz .

İşte çok basit bir örnek:

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        Type t = Type.GetType("Foo");
        MethodInfo method 
             = t.GetMethod("Bar", BindingFlags.Static | BindingFlags.Public);

        method.Invoke(null, null);
    }
}

class Foo
{
    public static void Bar()
    {
        Console.WriteLine("Bar");
    }
}

Basit diyorum çünkü bu şekilde aynı montajın içinde olan bir tip bulmak çok kolay. Lütfen bu konuda bilmeniz gerekenler konusunda daha kapsamlı bir açıklama için Jon'un cevabına bakın . Türü aldıktan sonra benim örneğim yöntemi nasıl çağıracağınızı gösterir.


103

Kullanabilirsiniz Type.GetType(string), ancak ad alanı dahil tam sınıf adını bilmeniz gerekir ve mevcut derlemede veya mscorlib'de değilse bunun yerine derleme adına ihtiyacınız olacaktır. (İdeal olarak Assembly.GetType(typeName)bunun yerine kullanın - montaj referansını doğru almak açısından bunu daha kolay buluyorum!)

Örneğin:

// "I know String is in the same assembly as Int32..."
Type stringType = typeof(int).Assembly.GetType("System.String");

// "It's in the current assembly"
Type myType = Type.GetType("MyNamespace.MyType");

// "It's in System.Windows.Forms.dll..."
Type formType = Type.GetType ("System.Windows.Forms.Form, " + 
    "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, " + 
    "PublicKeyToken=b77a5c561934e089");

1
+1 Harika - Türü aldıktan sonra türü nasıl kullanacağınızı gösteren bir yanıt ekledim . İstersen, devam et ve örneğimi cevabınla birleştir, ben de benimkini sileceğim.
Andrew Hare

Sizinki zaten kabul edildiğine göre, bunu tam tersi şekilde yapmamızı öneririm - içeriğimi cevabınıza ekleyin ve bunu sileceğim :)
Jon Skeet

4
Sadece cevabınızı daha da genişletmek için, GetType fonksiyonuna metin olarak neyi ileteceğinizden emin değilseniz ve bu sınıfa erişebiliyorsanız, typeof (class) 'a bakın.
techExplorer

10

Basit bir kullanım:

Type typeYouWant = Type.GetType("NamespaceOfType.TypeName, AssemblyName");

Örneklem:

Type dogClass = Type.GetType("Animals.Dog, Animals");

7

Cevap için biraz geç ama bu hile yapmalı

Type myType = Type.GetType("AssemblyQualifiedName");

montaj nitelikli adınız şöyle olmalı

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"

4
Montaj nitelikli adının neye benzemesi gerektiğini açıkça açıkladığınız için teşekkür ederiz.
Drew

3

Type.GetType aracılığıyla tür bilgilerini alabilirsiniz. Yöntem bilgilerini almak için bu sınıfı kullanabilir ve ardından yöntemi çağırabilirsiniz (statik yöntemler için ilk parametreyi null bırakın).

Türü doğru şekilde tanımlamak için Derleme adına da ihtiyacınız olabilir .

Tür şu anda yürütülen derlemede veya Mscorlib.dll'de ise, ad alanına göre nitelenen tür adını sağlamak yeterlidir.


0

Kullanabiliriz

Type.GetType ()

sınıf adını almak için ve kullanarak nesnesini de oluşturabilir Activator.CreateInstance(type);

using System;
using System.Reflection;

namespace MyApplication
{
    class Application
    {
        static void Main()
        {
            Type type = Type.GetType("MyApplication.Action");
            if (type == null)
            {
                throw new Exception("Type not found.");
            }
            var instance = Activator.CreateInstance(type);
            //or
            var newClass = System.Reflection.Assembly.GetAssembly(type).CreateInstance("MyApplication.Action");
        }
    }

    public class Action
    {
        public string key { get; set; }
        public string Value { get; set; }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.