以下是用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"
如何运作?
答案 0 :(得分: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
关键字之外支持此功能。相反,你最好不要一直选择特定的类型。
答案 1 :(得分:1)
如果Request("MonitorPath")
位于不包含Property Get/Get Request()
的类中,则其使用自身内部称为Request
的方法。 (没有实例限定,它不能调用另一个类属性。)
答案 2 :(得分:0)
我认为你正在混淆Request
的这两种用法 - 第一种用法可能与第二种用法无关。
请注意,该函数传入一个名为Request
的对象 - 如果RequestParameters
类似于Dictionary(Of String, String)
(C#相当于Dictionary<string, string>
),那么它很容易返回Request("MonitorPath")
的值,它根本不涉及该属性。
如果这对您没有帮助,那么RequestParameters
的结构是什么样的?