![](/img/trans.png)
[英]Using a generic argument in a generic method parameter created by CodeDOM
[英]using CodeDom create a generic method
我想使用codedom创建一个通用方法。
foreach (MethodInfo mhttem in sMethodName)
{
var mth = new CodeMemberMethod();
mth.Name = mhttem.Name;
mth.ReturnType = new CodeTypeReference(mhttem.ReturnType.Name);
foreach (var param in mhttem.GetParameters())
{
mth.Parameters.Add(new CodeParameterDeclarationExpression(param.ParameterType, param.Name));
}
}
但是在方法参数中,还会显示名称空间。 例如
ReminderTemplate GeTemplateById(System.Guid templateId);
我只想要
ReminderTemplate GeTemplateById(Guid templateId);
这里mth.Parameters.Add(new CodeParameterDeclarationExpression(param.ParameterType.Name,param.Name));
但是如果我有字符串类型参数,它将转换为字符串类
例如
PendingEmail GetByEmailToSubjectBodyMsg(String emailTo, String subject, String bodyMsg);
提前致谢
CSharpCodeGenerator
中有一个硬编码的类型列表,这些列表将转换为等效的C#类型。 如果全名不是C#识别的类型之一,则这些扩展方法将转换该类型的全名(名称空间+名称),将其剥离名称空间。
public static class CSharpCodeDomExtensions
{
// Taken from CSharpCodeGenerator.GetBaseTypeOutput(CodeTypeReference typeRef)
private static readonly HashSet<string> BaseTypes = new HashSet<string>
{
"system.int16", "system.int32", "system.int64",
"system.string", "system.object", "system.boolean", "system.void",
"system.char", "system.byte",
"system.uint16", "system.uint32", "system.uint64",
"system.sbyte",
"system.single", "system.double", "system.decimal"
};
private static bool IsBaseType(string fullName)
{
// It is done in this way in CSharpCodeGenerator.GetBaseTypeOutput
return BaseTypes.Contains(fullName.ToLower(CultureInfo.InvariantCulture).Trim());
}
public static string StripNameSpaces(this Type type)
{
string fullName = type.FullName;
if (IsBaseType(fullName))
{
return fullName;
}
return type.Name;
}
public static string StripNameSpaces(this string fullName)
{
if (IsBaseType(fullName))
{
return fullName;
}
return fullName.Split('.').Last();
}
}
像这样使用它:
mth.Parameters.Add(new CodeParameterDeclarationExpression(param.ParameterType.StripNamespaces(), param.Name));
请注意,剥离名称空间有一些缺点:必须确保在CodeDom
包含“正确的”名称空间,并且可能有多个类共享同一名称空间。 另一个问题:您无法区分OuterClass.InnerClass
和Namespace.OuterClass
。 无法对此进行轻松检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.