创建T4生成类型的通用List <t> </t>

时间:2014-04-23 13:19:46

标签: c# list generics t4

我使用T4技术创建了简单的类。

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
using System;

<# var properties = new String[]{"P1", "P2", "P3"}; #>
public class MyGeneratedClass {
<#  
    for(int i = 0; i < 3; i++)
    {
    #>
        private Int32 _<#= properties[i] #> = <#= i #>;
        public Int32 <#= properties[i] #> 
        {
            get 
            {
                return _<#= properties[i] #>;
            }
        } 
    <#
    }
    #>
}

然后我创建了这个生成类型的实例,如此

static void Main(String[] args)
{
    var template = new Template1();
    var text = template.TransformText();

    CodeDomProvider codeProvider = new CSharpCodeProvider();
    ICodeCompiler compiler = codeProvider.CreateCompiler();

    // add compiler parameters
    var compilerParams = new CompilerParameters
    {
        CompilerOptions = "/target:library /optimize",
        GenerateExecutable = false,
        GenerateInMemory = true,
        IncludeDebugInformation = false
    };
    compilerParams.ReferencedAssemblies.Add("mscorlib.dll");
    compilerParams.ReferencedAssemblies.Add("System.dll");

    // compile the code
    var compilerResults = compiler.CompileAssemblyFromSource(compilerParams, text);

    if (compilerResults.Errors.HasErrors)
        throw new Exception();

    // Создаем экземпляр класса
    var instance = compilerResults.CompiledAssembly.CreateInstance("MyGeneratedClass");
    if (instance == null)
        return;

    var TYPE = instance.GetType();
    var list = new List<TYPE>(); 

}

var list = new List<TYPE>();生成编译时错误:

  

找不到类型或命名空间名称“TYPE”(您是否缺少using指令或程序集引用?)

  1. 有没有办法创建类型为MyGeneratedClass类的通用列表(或某些通用集合)?
  2. 是否有更简单的方法来创建MyGeneratedClass类的实例?

1 个答案:

答案 0 :(得分:3)

Type genericListType = typeof(List<>);
Type[] typeArgs = new[] { instance.GetType() };
var generic = genericListType.MakeGenericType(typeArgs);
System.Collections.IList list = (System.Collections.IList)Activator.CreateInstance(generic);

foreach (dynamic item in list)
{
//whatever
}

希望我帮到你..

编辑更实用的内容,

如果尝试添加与特定运行时类型不同的东西,这种方法对于 ArrayList 没有太多优势,只是在运行时存在异常。虽然 ArrayList 在&#34;错误&#34;的情况下不会抛出异常。如果您使用这些项目,则添加项目将会或不会是例外。我这样做(即使我不知道编译时的类型)尝试使用具体的泛型而不是开放的 ArrayList ,因为异常是在正确的代码行(IMHO)引发的。