Лучший способ вызвать фабричный метод через отражение - PullRequest
0 голосов
/ 13 июля 2011

У меня есть следующий класс (с частным .ctor и общедоступным методом фабрики)

public class TypeWithFactoryMethods
{
    private TypeWithFactoryMethods()
    {
    }

    public static TypeWithFactoryMethods Create()
    {
        return new TypeWithFactoryMethods();
    }
}

Каков наилучший способ вызова метода public factory (Create) через отражение, чтобы я мог получить экземпляр типа?

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

Не совсем уверен, какова цель, но это сделало бы это:

Type type = typeof(TypeWithFactoryMethods);
MethodInfo info = type.GetMethod("Create", BindingFlags.Static | BindingFlags.Public);
object myObject = info.Invoke(null, null);
myObject.GetType(); //returns TypeWithFactoryMethods

Обновление после комментария

Если вы хотите найти все методы, которые возвращают указанный вами тип, вы можете использовать Linq, чтобы найти их:

Type type = typeof(TypeWithFactoryMethods);
List<MethodInfo> methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public)
    .Where(m => m.ReturnType == type).ToList();
foreach (var method in methods)
{
    ParameterInfo[] parameters = method.GetParameters(); //use parameters to decide how to invoke
    object myObject = method.Invoke(null, null);
    myObject.GetType(); //returns TypeWithFactoryMethods
}
0 голосов
/ 24 января 2012

Меньше кода для того же результата:

var param = Expression.Parameter(typeof (TypeWithFactoryMethods));
            var method = Expression.Call(null,typeof(TypeWithFactoryMethods).GetMethod("Create"));
            Expression.Lambda<Action>(method).Compile()();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...