【发布时间】:2012-02-07 03:40:49
【问题描述】:
我正在使用 CodeDom 和纯代码字符串在 Visual Studio 扩展中生成代码。我的扩展使用反射读取当前类声明的字段和属性,并生成构造函数、初始化程序、实现某些接口等。
生成器类很简单:
public class CodeGenerator < T >
{
public string GetCode ()
{
string code = "";
T type = typeof(T);
List < PropertyInfo > properties = t.GetProperties();
foreach (PropertyInfo property in properties)
code += "this." + property.Name + " = default(" + property.PropertyType.Name + ")";
}
}
我被两种方式困在字段和属性初始化器上。
首先,虽然default(AnyNonGenericValueOrReferenceType) 似乎在大多数情况下都有效,但我对在生成的代码中使用它感到不舒服。
其次,它不适用于泛型类型,因为我找不到获取泛型类型的基础类型的方法。所以如果一个属性是List < int >,property.PropertyType.Name 返回List`1。这里有两个问题。首先,我需要在不使用字符串操作的情况下获取泛型类型的正确名称。其次,我需要访问底层类型。完整的属性类型名称返回如下内容:
【问题讨论】:
-
您能否详细说明为什么不喜欢使用
default(T)? -
这不是一个炫技,但我宁愿使用 CodeDom 来生成一个普通用户熟悉的初始化程序。仍然有很多开发人员没有遇到过深入的泛型,你会偶然发现 default(T) 构造。
-
你为什么还要生成这段代码?在构造函数运行之前,所有字段都设置为默认值。这包括自动属性的支持字段。
-
请看我对下面答案的评论。
-
我正在尝试这两种方法,并将相应地标记答案。谢谢两位。顺便说一句,我们可以将多个答案标记为正确吗?
标签: c# generics reflection properties initializer