[英]Get the actual enum type from a nullable enum type in a switch statement during roslyn analyis
[英]Trying to create a type in Roslyn from a Type, but I get BadImageFormatException when converting a nullable
我正在尝试编写一个接受现有Type的函数,并将Type转换为PropertyDeclaration。 我几乎让它工作,但如果Type I传入的是Nullable,当我最终尝试用它编译我的类时,我得到这个错误: System.BadImageFormatException:不是一个有效的Win32应用程序。 (HRESULT异常:0x800700C1)。
这是我的代码:
var classDeclaration = SyntaxFactory.ClassDeclaration("class name");
classDeclaration.AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword));
classDeclaration.AddMembers(ConvertToProperty(myType, myTypeName));
private static PropertyDeclarationSyntax ConvertToProperty(Type propertyType, string propertyName)
{
var typeSyntax = SyntaxFactory.ParseTypeName(propertyType.ToString());
var propertyDeclaration = SyntaxFactory.PropertyDeclaration(typeSyntax, propertyName)
.AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
.AddAccessorListAccessors(
SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),
SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)));
return propertyDeclaration;
}
如果Type I传入不可为空,那么该类将编译得很好。 我对Roslyn不是很熟悉,我没有在网上找到任何人在做我正在做的事情的例子。 有人比较熟悉并有想法吗?
首先,您确实需要在问题中添加更多详细信息。 看这里: 最小,完整和可验证的例子
对于您的问题,当您在非nullable
类型上运行代码时,让我们说int
将获得此输出:
public class MyClass
{
public System.Int32 MyProperty { get; set; }
}
但是有了nullable
,你会得到这个:
public class MyClass
{
public System.Nullable`1[System.Int32] MyProperty { get; set; }
}
您可以看到它不是有效的C#代码。
要解决它,请检查此答案 ,只需复制粘贴,结果将如下所示:
public class MyClass
{
public Nullable<Int32> MyProperty { get; set; }
}
完整代码:
private static PropertyDeclarationSyntax ConvertToProperty(Type propertyType, string propertyName)
{
var typeSyntax = ParseTypeName(propertyType.ToGenericTypeString());
return PropertyDeclaration(typeSyntax, propertyName)
.AddModifiers(Token(SyntaxKind.PublicKeyword))
.AddAccessorListAccessors(
AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(Token(SyntaxKind.SemicolonToken)),
AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(Token(SyntaxKind.SemicolonToken)));
}
var classDeclaration = ClassDeclaration("MyClass");
classDeclaration = classDeclaration.AddModifiers(Token(SyntaxKind.PublicKeyword));
classDeclaration = classDeclaration.AddMembers(ConvertToProperty(typeof(int?), "MyProperty"));
Console.WriteLine(classDeclaration.ToString());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.