.NET 3.5에서 동적 객체 생성 및 메소드 호출을 수행하는 방법
-
20-08-2019 - |
문제
클래스의 객체를 만드는 코드는 어떻게 보입니까?
string myClass = "MyClass";
위의 유형의 다음 호출하십시오
string myMethod = "MyMethod";
그 목적에?
해결책
- 사용
Type.GetType(string)
유형 객체를 얻으려면. - 사용
Activator.CreateInstance(Type)
인스턴스를 만듭니다. - 사용
Type.GetMethod(string)
방법을 검색합니다. - 사용
MethodBase.Invoke(object, object[])
객체에서 메소드를 호출합니다
예를 들어, 오류 확인이 없음 :
using System;
using System.Reflection;
namespace Foo
{
class Test
{
static void Main()
{
Type type = Type.GetType("Foo.MyClass");
object instance = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("MyMethod");
method.Invoke(instance, null);
}
}
class MyClass
{
public void MyMethod()
{
Console.WriteLine("In MyClass.MyMethod");
}
}
}
각 단계마다 신중한 점검이 필요합니다. 유형을 찾지 못할 수도 있고 매개 변수가없는 생성자가 없을 수 있습니다. 메소드를 찾지 못할 수도 있고 잘못된 인수 유형으로 호출 할 수 있습니다.
주목할만한 점 : type.getType (String)는 현재 실행중인 어셈블리 또는 mscorlib에 있지 않은 한 유형의 어셈블리 자격 이름이 필요합니다.
다른 팁
.NET을 사용하여 동적 객체 생성 및 호출을 단순화하는 라이브러리를 만들었습니다. 라이브러리와 코드를 Google 코드에서 다운로드 할 수 있습니다. 늦은 바인딩 도우미프로젝트에서 당신은 a를 찾을 수 있습니다 사용량이있는 위키 페이지, 또는 이것을 확인할 수도 있습니다 CodeProject의 기사
내 라이브러리를 사용하면 예제가 다음과 같습니다.
IOperationInvoker myClass = BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass");
myClass.Method("MyMethod").Invoke();
또는 더 짧은 :
BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass")
.Method("MyMethod")
.Invoke();
유창한 인터페이스를 사용하고 이러한 종류의 작업을 진정으로 단순화합니다. 유용하다는 것을 알 수 있기를 바랍니다.
다음은 공개 생성자가있는 객체와 일부 값을 반환하지만 매개 변수를 가져 오지 않는 공개 메소드를 가정합니다.
var object = Activator.CreateInstance( "MyClass" );
var result = object.GetType().GetMethod( "MyMethod" ).Invoke( object, null );
클래스가 실행 어셈블리에 있다고 가정하면 생성자와 방법이 매개 변수가 없습니다.
Type clazz = System.Reflection.Assembly.GetExecutingAssembly().GetType("MyClass");
System.Reflection.ConstructorInfo ci = clazz.GetConstructor(new Type[] { });
object instance = ci.Invoke(null); /* Send parameters instead of null here */
System.Reflection.MethodInfo mi = clazz.GetMethod("MyMethod");
mi.Invoke(instance, null); /* Send parameters instead of null here */
제휴하지 않습니다 StackOverflow