Odbicie języka C #: Jak uzyskać odwołanie do klasy z ciągu?


90

Chcę to zrobić w C #, ale nie wiem jak:

Mam ciąg z nazwą klasy -eg: FooClassi chcę wywołać metodę (statyczną) w tej klasie:

FooClass.MyMethod();

Oczywiście muszę znaleźć odniesienie do klasy poprzez refleksję, ale jak?

Odpowiedzi:


125

Będziesz chciał użyć Type.GetTypemetody.

Oto bardzo prosty przykład:

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");
    }
}

Mówię proste, ponieważ bardzo łatwo jest znaleźć w ten sposób typ, który jest wewnętrzny dla tego samego zespołu. Zapoznaj się z odpowiedzią Jona, aby uzyskać dokładniejsze wyjaśnienie, co musisz o tym wiedzieć. Po pobraniu typu mój przykład pokazuje, jak wywołać metodę.


101

Możesz użyć Type.GetType(string), ale musisz znać pełną nazwę klasy, w tym przestrzeń nazw, a jeśli nie ma jej w bieżącym zestawie lub mscorlib, będziesz potrzebować zamiast tego nazwy zestawu. (Idealnie, użyjAssembly.GetType(typeName) zamiast tego - uważam, że jest to łatwiejsze pod względem uzyskania prawidłowego odniesienia do zestawu!)

Na przykład:

// "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 Świetnie - dodałem odpowiedź, która pokazuje, jak używać tego typu po jego pobraniu. Jeśli chcesz, włącz mój przykład do swojej odpowiedzi, a ja usunę mój.
Andrew Hare,

Biorąc pod uwagę, że Twoja została już zaakceptowana, sugeruję, abyśmy zrobili to w drugą stronę - dodaj moją treść do swojej odpowiedzi, a ja ją usunę :)
Jon Skeet

4
Aby rozszerzyć swoją odpowiedź, jeśli nie jesteś pewien, co przekazać jako tekst do funkcji GetType i możesz uzyskać dostęp do tej klasy, spójrz na typeof (class) .AssemblyQualifiedName, to da jasny pomysł.
techExplorer

10

Proste użycie:

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

Próba:

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

7

Trochę za późno na odpowiedź, ale to powinno załatwić sprawę

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

kwalifikowana nazwa twojego zestawu powinna być taka

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

4
Dziękujemy za wyraźne wyjaśnienie, jak powinna wyglądać nazwa kwalifikowana zestawu.
Drew

3

Poprzez Type.GetType można uzyskać informacje o typie. Możesz użyć tej klasy, aby uzyskać informacje o metodzie, a następnie wywołać metodę (w przypadku metod statycznych pozostaw pierwszy parametr o wartości null).

Możesz również potrzebować nazwy zestawu, aby poprawnie zidentyfikować typ.

Jeśli typ znajduje się w aktualnie wykonywanym zestawie lub w Mscorlib.dll, wystarczy podać nazwę typu kwalifikowaną przez jego przestrzeń nazw.


0

Możemy użyć

Type.GetType ()

aby uzyskać nazwę klasy, a także utworzyć jej obiekt za pomocą 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; }
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.