2

下面是用 VB .cls 文件编写的代码片段:

Public Property Get Request() As String
    Request = m_sRequest
End Property
Public Property Let Request(sData As String)
    m_sRequest = sData
    ParseRequest sData
End Property

在另一个类中,使用以下行:

Public Sub LogError(Request As RequestParameters, ByVal sData As String, ibErr As CibErr)

Dim sErrorLog as string

 sErrorLog = Request("MonitorPath") & "\Log\Debug\Errors"
    If Dir(sErrorLog, vbDirectory) = "" Then
        MkDir sErrorLog
    End If

.
.
.

End Sub

我正在尝试将此代码迁移到 C#,但我不明白如何Request("MonitorPath")返回字符串。

如果是 - 如何,因为Let没有任何返回类型?
如果没有 - 如何sErrorLog = Request("MonitorPath") & "\Log\Debug\Errors"工作?

4

3 回答 3

1

与旧 vb6 代码等效的 C# 如下所示:

private string m_Request;
public string Request 
{
   get {return m_Request;}
   set
   {
      m_Request = value;
      ParseRequest(value);
   }
}

等效于该函数的 C# 是这样的:

public void LogError(RequestParameters Request, string Data, CibErr ibErr)
{
    // the "Request" here is a different Request than the property above
    // I have to guess a bit, but I think it's probably an indexed property
    string ErrorLog = Request["MonitorPath"] + @"\Log\Debug\Errors";

    // There is no need to check if the folder exists.
    // If it already exists, this call will just complete with no changes
    Directory.CreateDirectory(ErrorLog);

    //generally, checking for existence of items in the file system before using them is BAD
    // the file system is volatile, and so checking existence is a race condition
    // instead, you need to have good exception handling
}

对于问题的类型部分,如果您没有为某个项目指定返回类型,则返回类型为Object. 但这只是编译器类型。实际的对象引用将具有从 Object 继承的更具体的类型。在这种情况下,该类型是String但是,因为编译器只知道Object如果您只想将对象视为您知道的字符串,则必须关闭 Option Strict Off。那很糟。太糟糕了,C# 根本不允许在特殊dynamic关键字之外支持这一点。相反,您最好始终选择特定类型。

于 2013-07-25T14:07:38.870 回答
1

如果Request("MonitorPath")在一个不包含的类中, Property Get/Get Request()那么它在自身内部使用一个称为 的方法Request。(它不能在没有实例限定的情况下调用另一个类属性)。

于 2013-07-25T14:09:32.023 回答
0

我认为您将这两种用法混为一谈Request-第一种用法可能与第二种用法无关。

请注意,该函数传入一个名为Request- if的对象RequestParameters类似于Dictionary(Of String, String)(C# 等价于Dictionary<string, string>),那么它可以很容易地返回 的值Request("MonitorPath"),并且根本不涉及该属性。

如果这对您没有帮助,那么结构是RequestParameters什么样的?

于 2013-07-25T14:17:42.543 回答