簡體   English   中英

嘗試從Type中創建Roslyn中的類型,但是在轉換可空時我得到BadImageFormatException

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM