Chcę to zrobić w C #, ale nie wiem jak:
Mam ciąg z nazwą klasy -eg: FooClass
i chcę wywołać metodę (statyczną) w tej klasie:
FooClass.MyMethod();
Oczywiście muszę znaleźć odniesienie do klasy poprzez refleksję, ale jak?
Odpowiedzi:
Będziesz chciał użyć Type.GetType
metody.
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ę.
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");
Proste użycie:
Type typeYouWant = Type.GetType("NamespaceOfType.TypeName, AssemblyName");
Próba:
Type dogClass = Type.GetType("Animals.Dog, Animals");
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"
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.
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; }
}
}