我使用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指令或程序集引用?)
MyGeneratedClass
类的通用列表(或某些通用集合)?MyGeneratedClass
类的实例?答案 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)引发的。