Я хочу сделать это на С#, но я не знаю, как:
У меня есть строка с именем класса -e.g: FooClass
, и я хочу вызвать (статический) метод в этом классе:
FooClass.MyMethod();
Очевидно, мне нужно найти ссылку на класс через отражение, но как?
Я хочу сделать это на С#, но я не знаю, как:
У меня есть строка с именем класса -e.g: FooClass
, и я хочу вызвать (статический) метод в этом классе:
FooClass.MyMethod();
Очевидно, мне нужно найти ссылку на класс через отражение, но как?
Вы захотите использовать метод Type.GetType
.
Вот очень простой пример:
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");
}
}
Я говорю просто, потому что очень легко найти такой тип, который является внутренним для одной и той же сборки. Пожалуйста, см. Jon answer для более подробного объяснения того, что вам нужно знать об этом. После того, как вы получили тип, в моем примере показано, как вызвать метод.
Вы можете использовать Type.GetType(string)
, но вам нужно знать полное имя класса, включая пространство имен, и если оно отсутствует в текущей сборке или в mscorlib, вам понадобится имя сборки. (В идеале вместо этого используйте Assembly.GetType(typeName)
- я считаю, что это проще с точки зрения правильной ссылки на сборку!)
Например:
// "I know String is in the same assembly as Int32..."
Type stringType = typeof(int).Assembly.GetType("System.String");
// "It in the current assembly"
Type myType = Type.GetType("MyNamespace.MyType");
// "It 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");
Простое использование:
Type typeYouWant = Type.GetType("NamespaceOfType.TypeName, AssemblyName");
Пример:
Type dogClass = Type.GetType("Animals.Dog, Animals");
Бит опоздал для ответа, но это должно сделать трюк
Type myType = Type.GetType("AssemblyQualifiedName");
ваше квалифицированное имя сборки должно выглядеть следующим образом
"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"
Через Type.GetType вы можете получить информацию о типе. Вы можете использовать этот класс для получить информацию о методе, а затем invoke метод (для статических методов оставьте первый параметр null).
Вам также может понадобиться Название сборки, чтобы правильно идентифицировать тип.
Если тип находится в текущем выполнение сборки или в Mscorlib.dll, достаточно указать тип имя, присвоенное его пространством имен.
Мы можем использовать
Type.GetType()
получить имя класса, а также создать его объект, используя 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; }
}
}