. , unit test "" . - . , , . , .
public static class ReflectionHelper
{
public static object RunStaticMethod<TInstance>(string methodName, params object[] methodParams)
{
var methodType = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
return RunMethod<TInstance>(null, methodName, methodType, methodParams);
}
public static object RunInstanceMethod<TInstance>(this TInstance instance, string methodName, params object[] methodParams)
{
var methodType = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
return RunMethod<TInstance>(instance, methodName, methodType, methodParams);
}
private static object RunMethod<TInstance>(object instance, string methodName, BindingFlags methodType, params object[] methodParams)
{
var instanceType = typeof(TInstance);
var method = instanceType.GetMethod(methodName, methodType);
if (method == null)
{
throw new ArgumentException(string.Format("There is no method '{0}' for type '{1}'.", methodName, instanceType));
}
var result = method.Invoke(instance, methodParams);
return result;
}
}
,
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
internal string GetPrettyName()
{
return string.Concat(FirstName, " ", LastName);
}
static internal int GetSystemId(string userName)
{
return 13;
}
}
var user = new User { FirstName = "Peter", LastName = "Gibbons" };
var name = user.RunInstanceMethod("GetPrettyName");
Assert.That(name, Is.EqualTo("Peter Gibbons"));
var id = ReflectionHelper.RunStaticMethod<User>("GetSystemId", "tester");
Assert.That(id, Is.EqualTo(13));