다른 프로젝트 이름 ProjectA.B.C
을 가지고 있으며, ProjectA.B.C
라는 이름의 어셈블리를 내뿜으며, 그것은 다음과 같은 방법 서명 다음과 같은 내부 클래스 구현 다음과 같은 네임 스페이스가있는 경우 :
namespace ProjectA.B.C
{
class Caching
{
public static bool GetOrSet<T>(string key, Func<T> getValue, out T value, TimeSpan? expiration = null) {
...
}
public static bool Get<T>(string key, out T value) {
...
}
}
}
을 단위 테스트를 위해 다음과 같이 호출 할 수 있습니다.
var type = Assembly.Load("ProjectA.B.C").GetTypes().First(x => x.Name.Equals("Caching", StringComparison.Ordinal));
var methods = type.GetMethods();
var getOrSetMethod = methods.First(x => x.Name.Equals("GetOrSet", StringComparison.Ordinal) && x.ReturnType.Name.Equals("Boolean", StringComparison.Ordinal)).MakeGenericMethod(typeof(bool));
var getMethod = methods.First(x => x.Name.Equals("Get", StringComparison.Ordinal)).MakeGenericMethod(typeof(bool));
var resultToSet = true;
Func<bool> action =() => { return resultToSet; };
if (!(bool)getOrSetMethod.Invoke(null, new object[] { "GetOrSet", action, resultToSet, (TimeSpan?)null }))
throw new Exception("Could not set the GetOrSet key to a boolean value of true.");
var parameters = new object[] { "GetOrSet", resultToSet };
if (!(bool)getMethod.Invoke(null, parameters))
throw new Exception("Could not get back the GetOrSet key.");
if ((bool)parameters[1] != true)
throw new Exception("Got the wrong GetOrSet key back.");
T 그는 위의 방법을 보여줍니다 :
- 일반 함수 매개 변수를 만듭니다.
MakeGenericMethod(params Type[] typeArguments)
을 사용하여 제네릭으로 메서드를 호출합니다.
out
매개 변수로 메소드를 호출하고 결과에 대해 매개 변수 배열을 확인하십시오.
내부적으로 보호되어 있지 않습니다. 그래도 Assembly.GetType을 사용할 수 있습니다. 아직 시도해 보셨습니까? –
@JonSkeet 질문을 업데이트했지만 어셈블리 참조를 얻는 방법을 아직 모릅니다. – Alexandru
wablab의 대답은 실제로 더 나은 접근법입니다. –