[英]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.