【发布时间】:2011-09-23 21:23:00
【问题描述】:
是否有任何静态类型的强类型编译语言提供在编译时迭代类型成员并为每个成员生成模板化代码的功能?例如,它可能是这样的:
// in pseudo-C#
public static void AddParameter(string parameterName, object value) { /* ... */ }
public static void AddParameters<T>(T parameters) {
// Of course, the memberof(T), membersof(T), membername(<member>)
// and membervalue(<member>, object) operators would be valid
// inside a "compile for" block only
compile for (memberof(T) member in membersof(T))
AddParameter(membername(member), membervalue(member, parameters));
/* If this were actual C#, the "compile for" block could even have a where clause */
}
所以,如果进行了以下调用:
StaticClass.AddParameters(new { UserID = "eleon", Password = "Gu3$$17" });
然后AddParameters 的特定实例化将展开到
public static void AddParameters(InternalNameOfTheAnonymousType parameters) {
AddParameters("UserID", parameters.UserID);
AddParameters("Password", parameters.Password);
}
在编译时(如果它是在 IL-to-native 编译时的实际 C#)
【问题讨论】:
-
@Marcin:我不会将我必须编写的代码量减少约 15%(这是一个保守的估计)称为“过早的优化”。
-
@Marcin:我目前在泛型方法
AddParameters中使用反射,但是,由于反射很慢,我必须保持愚蠢的静态Dictionary<Type, PropertyInfo[]>s 以避免多次调用Type.GetProperties()同一类型。 -
哈希表是如何低效的?
-
@Eduardo Leon:所以使用不同类型的字典结构,比如 alist。