【问题标题】:Cannot be accessed with an instance reference after code conversion [duplicate]代码转换后无法通过实例引用访问[重复]
【发布时间】:2016-04-10 18:49:43
【问题描述】:

我有以下代码,它是在使用 Telerik 代码转换器将一段遗留代码转换为 C# 后创建的,但它产生了错误

错误 473 成员 'System.Xml.XmlWriter.Create(System.IO.Stream, System.Xml.XmlWriterSettings)' 无法通过实例引用访问;改为使用类型名称来限定它

public virtual string Serialize()
{
    System.IO.StreamReader streamReader = null;
    System.IO.MemoryStream memoryStream = null;
    try
    {
        memoryStream = new System.IO.MemoryStream();
        System.Xml.XmlWriterSettings xmlWriterSettings = new System.Xml.XmlWriterSettings();
        xmlWriterSettings.Indent = false;
        System.Xml.XmlWriter xmlWriter = xmlWriter.Create(memoryStream, xmlWriterSettings);
        Serializer.Serialize(xmlWriter, this);
        memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
        streamReader = new System.IO.StreamReader(memoryStream);
        return streamReader.ReadToEnd();
     }
     finally
     {
         if ((((streamReader) != null)))
         {
             streamReader.Dispose();
         }
         if ((((memoryStream) != null)))
         {
             memoryStream.Dispose();
         }
     }
}

错误发生就行了:

System.Xml.XmlWriter xmlWriter = xmlWriter.Create(memoryStream, xmlWriterSettings);

在VB.Net中代码如下:

Public Overridable Function Serialize() As String
    Dim streamReader As System.IO.StreamReader = Nothing
    Dim memoryStream As System.IO.MemoryStream = Nothing
    Try
        memoryStream = New System.IO.MemoryStream()
        Dim xmlWriterSettings As System.Xml.XmlWriterSettings = New System.Xml.XmlWriterSettings()
        xmlWriterSettings.Indent = False
        Dim xmlWriter As System.Xml.XmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings)
        Serializer.Serialize(xmlWriter, Me)
        memoryStream.Seek(0, System.IO.SeekOrigin.Begin)
        streamReader = New System.IO.StreamReader(memoryStream)
        Return streamReader.ReadToEnd
    Finally
        If (Not (streamReader) Is Nothing) Then
            streamReader.Dispose()
        End If
        If (Not (memoryStream) Is Nothing) Then
            memoryStream.Dispose()
        End If
    End Try
End Function

【问题讨论】:

    标签: c# vb.net telerik instance-reference


    【解决方案1】:

    大小写不正确。尝试将 xmlWriter.Create 更改为 XmlWriter.Create(大写 X)。我不确定为什么转换器会改变你。它显然只是因为变量名和类型名相同而感到困惑。

    【讨论】:

    • 感谢 Steven 真的应该解决这个问题 :)
    【解决方案2】:

    这在我目前使用的大多数语言中似乎有点无效

    type varName = varName.DoSmth();
    

    自动转换工具的混淆来自于类型和变量名的相似。您需要从XmlWriter 调用Create() 作为静态方法

    System.Xml.XmlWriter xmlWriter = System.Xml.XmlWriter.Create(memoryStream, xmlWriterSettings);
    

    P.S.:使用工具生成代码从来都不是好主意。

    【讨论】:

    • 感谢 Royal 的解释我知道它不是生成代码的好方法我只是认为通过将其转换为 C# 来理解正在发生的事情可能会很方便,因为它对我来说更具可读性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    相关资源
    最近更新 更多