C#enum到JavaScript的自动翻译
我在从ASP.NET页面调用的.NET程序集中有一个标志枚举。我想让Visual Studio构建步骤生成一个C#enum到JavaScript的自动翻译,c#,javascript,asp.net,reflection,code-translation,C#,Javascript,Asp.net,Reflection,Code Translation,我在从ASP.NET页面调用的.NET程序集中有一个标志枚举。我想让Visual Studio构建步骤生成一个.js文件,该文件中包含与JavaScript等效的内容。有什么工具可以做这件事吗 编辑:这似乎有效 public class JavaScriptReflection { public static string Go(Type type) { if (!type.IsEnum) return; StringBuilder sb =
.js
文件,该文件中包含与JavaScript等效的内容。有什么工具可以做这件事吗
编辑:这似乎有效
public class JavaScriptReflection
{
public static string Go(Type type)
{
if (!type.IsEnum) return;
StringBuilder sb = new StringBuilder();
sb.AppendFormat("var {0} = {{ ", type.Name);
foreach (FieldInfo fInfo in
type.GetFields(BindingFlags.Public | BindingFlags.Static))
sb.AppendFormat("{0}:{1},\r\n",
fInfo.Name,
fInfo.GetRawConstantValue().ToString());
sb.Append("};");
return sb.toString();
}
}
我最近成功地使用输出程序集文件上的反射来生成代码 尝试在控制台应用程序中使用类似的内容,您可以通过后期生成过程调用该应用程序:
Assembly assembly = Assembly.LoadFile("FileName");
Type myEnumType = assembly.GetType("EnumName");
foreach(MemberInfo mi in myEnumType.GetMembers().Where(m => m.MemberType == MemberTypes.Field))
Console.WriteLine(mi.Name);
我最近成功地使用输出程序集文件上的反射来生成代码 尝试在控制台应用程序中使用类似的内容,您可以通过后期生成过程调用该应用程序:
Assembly assembly = Assembly.LoadFile("FileName");
Type myEnumType = assembly.GetType("EnumName");
foreach(MemberInfo mi in myEnumType.GetMembers().Where(m => m.MemberType == MemberTypes.Field))
Console.WriteLine(mi.Name);
是一件需要调查的事情。是一件需要调查的事情。我会+1你编辑它,这是一个答案。在UNIX程序中,它似乎是适合这项工作的工具。我希望你能编辑它,这是一个答案。在UNIX程序中,它似乎是执行此任务的合适工具。为什么不使用
Enum.GetValues(myEnumType)
来代替呢?您指的是Enum.GetNames()。是的,在这种情况下会更简单。OP问题试图使用反射,因此我给出了通过反射访问枚举值的方法。^顺便说一句,在这种情况下,您仍然必须使用反射来获取枚举类型,因为您正在加载外部程序集以生成代码。将被替换的只是.GetMembers()。其中(m=>m.MemberType==MemberTypes.Field)
。对于加载类型的前两行,我没有任何参数(这就是为什么我使用了与您编写的相同的变量名)。您应该使用Enum.GetNames
或Enum.GetValues
而不是该foreach。如果您同时需要名称和值(在大多数情况下),Enum.GetNames
将导致对每个名称使用Enum.Parse
,但是通过使用Enum.GetValues
,您可以将名称(.ToString()
)和值放在一起,这取决于生成的代码。您可能需要这些值,但我建议不要使用URL参数,因为整型值可读性较差。您可以通过MemberInfo获得更多的数据。使用反射生成代码时,通常还需要查看自定义属性,例如,使用System.ComponentModel.DescriptionAttribute
可以拉一个标签显示给用户--这是我从web客户端的枚举生成代码时经常做的事,您不能使用任何Enum
静态方法。为什么不改用Enum.GetValues(myEnumType)
呢?您指的是Enum.GetNames()。是的,在这种情况下会更简单。OP问题试图使用反射,因此我给出了通过反射访问枚举值的方法。^顺便说一句,在这种情况下,您仍然必须使用反射来获取枚举类型,因为您正在加载外部程序集以生成代码。将被替换的只是.GetMembers()。其中(m=>m.MemberType==MemberTypes.Field)
。对于加载类型的前两行,我没有任何参数(这就是为什么我使用了与您编写的相同的变量名)。您应该使用Enum.GetNames
或Enum.GetValues
而不是该foreach。如果您同时需要名称和值(在大多数情况下),Enum.GetNames
将导致对每个名称使用Enum.Parse
,但是通过使用Enum.GetValues
,您可以将名称(.ToString()
)和值放在一起,这取决于生成的代码。您可能需要这些值,但我建议不要使用URL参数,因为整型值可读性较差。您可以通过MemberInfo获得更多的数据。使用反射生成代码时,通常还需要查看自定义属性,例如,使用System.ComponentModel.DescriptionAttribute
可以拉一个标签显示给用户--这是我从web客户端的枚举生成代码时经常做的事,您不能使用任何Enum
静态方法。