Экземпляр универсального класса с типом из PropertyInfo.PropertyType

У меня есть классы, как показано ниже:

public class SampleClassToTest<T>
{
    public static Fake<T> SomeMethod(string parameter)
    {
        // some code
    }

    public static Fake<T> SomeMethod(string parameter, int anotherParameter)
    {
        //some another code
    }
}

public class Fake<T>
{
    // some code
}

И я хочу использовать их таким образом:

SampleClassToTest<MyClass>.SomeMethod("some parameter");

Проблема, которая у меня есть, заключается в следующем: тип "MyClass" я могу получить только из экземпляра PropertyInfo, используя Reflection, поэтому у меня есть

Type propertyType = propertyInfo.PropertyType;

Как я могу это сделать? Любые идеи?

UPD. Я пытаюсь передать тип универсальному методу. И да, это то, чего я хочу.


person nktssh    schedule 15.03.2013    source источник
comment
Это непонятно, имхо. Чего вы пытаетесь достичь и в чем проблема?   -  person Grant Thomas    schedule 15.03.2013
comment
Это выполнимо с отражением, но как только вы начнете использовать отражение, у вас не будет иного выбора, кроме как продолжать его полностью, что очень медленно работает и очень утомительно для кода. Вы уверены, что это то, что вы хотите?   -  person Jon    schedule 15.03.2013
comment
@GrantThomas, я пытаюсь передать тип универсальному методу. И да, это то, что я хочу.   -  person nktssh    schedule 15.03.2013
comment
@ Джон, ты можешь предложить лучший способ для этого? Я был бы признателен!   -  person nktssh    schedule 15.03.2013
comment
В примере не показаны универсальные методы... есть неуниверсальный метод для универсального типа.   -  person Marc Gravell    schedule 15.03.2013
comment
@ user1563880: Нет, потому что мы понятия не имеем, что вы пытаетесь сделать в первую очередь. Очевидно, что любой другой подход будет включать рефакторинг.   -  person Jon    schedule 15.03.2013


Ответы (2)


Вам нужно будет сделать:

typeof(SampleClassToTest<>).MakeGenericType(propertyType)
       .GetMethod("SomeMethod", new Type[] {typeof(string)})
       .Invoke(null, new object[] {"some parameter"});

Уродливый.

Если это вообще можно помочь, я бы посоветовал предложить неуниверсальный API, который принимает экземпляр Type; Самое приятное здесь то, что общий API может тривиально обращаться к неуниверсальному API, используя typeof(T).

person Marc Gravell    schedule 15.03.2013

Похоже, вы хотите:

Type propertyType;
Type classType = typeof(SampleClassToTest<>).MakeGenericType(propertyType);

MethodInfo method = classType.GetMethod("SomeMethod", BindingFlags.Static | BindingFlags.Public, null, new[] { typeof(string) }, null);
object fake = method.Invoke(null, new object[] { "some parameter" });
person Lee    schedule 15.03.2013
comment
оба варианта верны, но этот stackoverflow.com/a/15433260/1563880 короче - person nktssh; 15.03.2013