将类型转换为引用类型

时间:2013-12-12 17:55:04

标签: c# entity-framework reflection orm activator

我的方法有这样的约束:

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

这个T必须是引用类型,因为它将被传递给EntityTypeConfiguration。

但是,当使用 MappingTransformation.Convert&lt;&gt;(映射源)时,我只有一个Type,并且不知道如何将此Type转换为所需的“引用类型”。

以下是我尝试使用它的方法:

#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

如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

以前从不回答我自己的问题,但我想我明白了。还在测试,但我想我明白了。

阅读Stack Overflow的其他一些问题,我来到了这个:

#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

This was the question引导我得到Jon Skeet先生的回答。

答案 1 :(得分:0)

我想我明白了。

看起来你想在运行时定义泛型函数的类型,就像这样?

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

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

您想要找到类型,然后将其作为通用类型传递,是吗?

这实际上比你想象的要棘手。应用于泛型函数和类的类型必须在编译时定义,而不是在运行时定义。

要做你想做的事,你需要使用更多的反射see this related question for an example