Преобразование типа в ссылочный тип

У меня есть метод с таким ограничением:

public class MappingTransformation
{
    public static ClassMapped<T> Convert<T>(Mapping<T> source) where T : class
    {
        return ClassMapped<T>.GetInstance(source);
    }
}

Этот T ДОЛЖЕН быть ссылочным типом, потому что он будет передан в EntityTypeConfiguration.

Но при использовании MappingTransformation.Convert‹>(Mapping source) у меня есть только тип, и я не знаю, как преобразовать этот тип в необходимый «ссылочный тип».

Вот как я пытаюсь его потреблять:

#region Test
        foreach (var item in mappingAssembly.GetTypes())
        {
            var mappingObj = Activator.CreateInstance(item);

            var modelName = mappingObj.GetType().GetProperty("ModelName").GetValue(mappingObj);

            var modelTypeEquivalent = modelAssembly.GetTypes().First(x => x.Name.Equals(modelName));

            var convertido = MappingTransformation.Convert<Model.Clientes>((Mapping<Model.Clientes>)mappingObj);


            var breakpoint = true;
        }
#endregion

Как этого добиться?


person programad    schedule 12.12.2013    source источник
comment
Какую ошибку вы получаете?   -  person SouthShoreAK    schedule 12.12.2013
comment
Если я заменю ‹Model.Clientes› на что-нибудь, под ним появится волнистая линия. Я не знаю, что туда добавить, чтобы удалить жестко запрограммированный «Model.Clientes».   -  person programad    schedule 12.12.2013


Ответы (2)


Никогда не отвечай на мой собственный вопрос раньше, но я думаю, что понял. Все еще тестирую, но, кажется, у меня получилось.

Читая некоторые другие вопросы о переполнении стека, я пришел к следующему:

#region Test
        foreach (var item in mappingAssembly.GetTypes())
        {
            var mappingObj = Activator.CreateInstance(item);

            var modelName = mappingObj.GetType().GetProperty("ModelName").GetValue(mappingObj);

            var modelTypeEquivalent = modelAssembly.GetTypes().First(x => x.Name.Equals(modelName));

            var convertionMethod = typeof(MappingTransformation).GetMethod("Convert");
            var genericConvertionMethod = convertionMethod.MakeGenericMethod(modelTypeEquivalent);
            var result = genericConvertionMethod.Invoke(null, new object[] { mappingObj });

            var breakpoint = true;
        }
#endregion

Это был вопрос, который привел меня к ответу г-на , Джон Скит.

person programad    schedule 12.12.2013

Я думаю, что понял.

Похоже, вы хотите определить тип вашей универсальной функции во время выполнения, что-то вроде этого?

        var modelTypeEquivalent = modelAssembly.GetTypes().First(x => x.Name.Equals(modelName));

        var convertido = MappingTransformation.Convert<modelTypeEquivalent >((Mapping<Model.Clientes>)mappingObj);

Вы хотите найти тип, а затем передать его как тип для вашего универсального, верно?

Это на самом деле сложнее, чем вы думаете. Типы, применяемые к универсальным функциям и классам, должны быть определены во время компиляции, а не во время выполнения.

Чтобы делать то, что вы хотите, вам нужно больше рефлексии, для примера см. этот связанный вопрос.

person SouthShoreAK    schedule 12.12.2013
comment
Да, это проблема. Передайте тип в скобки дженериков. По связанному с вами вопросу им удалось приступить к работе с var count = x.CountItems((IStorable)someObjectThatImplementsStorable); Ведьма - точно такая же ситуация. Но мой не IStorable, это еще один общий метод! (Отображение‹T›). Вот в чем подвох, я не могу понять. - person programad; 12.12.2013