pmc*_*mcs 1 c# parameters methods asp-classic
我正在转换旧的经典ASP方法进行数据记录。参数之一可以是数组或字符串。我要声明什么类型的变量?我尝试将其声明为对象,然后测试,以查看它是否为数组。但是,我似乎无法解析出数组内容(应该是一个简单的字符串数组)。
这是经典ASP代码的一个片段:
Public function security(u,a,d)
' -------------------------------------------------------
' Write to tbl_log_security, returning a 1-Pass or 0-Fail
' -------------------------------------------------------
u = u + 0
af = u
if len(request.Cookies("userid")) > 0 then af = request.Cookies("userid")
security = 1 ' Success
Dim objCommandLog
Set objCommandLog = Server.CreateObject("ADODB.Connection")
objCommandLog.open = application("connVRVprimary")
Err.Clear
if isarray(d) then
for I = 0 to ubound(d)
strDetails = strDetails & chr(13) & "Detail " & I & ": " & d(i) & " "
next
elseif len(d) > 0 then : strDetails = d & " "
end if
Run Code Online (Sandbox Code Playgroud)
在这里,我认为它可能会转换为C#。
public static bool security(string UserID, string Action, object Details )
{
// Apparently, Details can be a string or an array !
// UserID is passed in as a string, we need to convert it to an int
Int32 iUserID; //af
string strDetails;
if (!Int32.TryParse(UserID, out iUserID))
{
//If it doesn't convert, then use the UserID from Application Object
iUserID = Convert.ToInt32(ApplicationObject.USERID);
}
Type valueType = Details.GetType();
if (valueType.IsArray)
{
for(int i = 0, i < Details.Length; i++)
{
strDetails += "Detail " + i + ": " + Details(i);
}
}
else
{ // is string
strDetails = Details;
}
Run Code Online (Sandbox Code Playgroud)
Intellisense告诉我无法获得length属性或无法对其进行迭代。我怀疑即使认为它可能以数组形式出现,也将其视为对象。任何帮助,将不胜感激。
正如Alexei在评论中提醒我的那样,这应该正确地是一对方法重载,并且其中一个都不重铸:
public static bool security(string UserID, string Action, string[] details)
public static bool security(string UserID, string Action, string details)
Run Code Online (Sandbox Code Playgroud)
如果允许的话,应该这样写。
在您拥有的版本中,如果需要进行该工作,则需要进行转换。您不能将类型对象的引用直接视为字符串或数组,即使它所引用的实际对象实际上是其中之一。您必须明确告诉编译器您想要什么。在这种情况下,我们还想问运行时所引用对象的实际类型是什么。
我不知道你的数组可能是一个数组的,但任何阵列是不通用的IEnumerable,因此我们将使用它。
// Check for string first, because String is IEnumerable.
if (Details is String s)
{
strDetails = s;
}
else if (Details is System.Collections.IEnumerable ienum)
{
int i = 0;
foreach (var s in ienum)
{
strDetails += "Detail " + i++ + ": " + s + "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
“参数之一可以是数组或字符串。我声明什么类型的变量?”
params 营救!
由于details是方法签名中的最后一个参数,因此可以将其定义为params参数,以允许传递任意数量的项目。
(注意:在C#中,方法名称通常是PascalCase,参数通常是camelCase)
public static bool Security(string userID, string action, params string[] details )
{
// Other code omitted for brevity
var strDetails = details == null ? " "
: details.Length == 1 ? $"{details[0]} "
: string.Join(Environment.NewLine,
details.Select((detail, index) => $"Detail {index}: {detail} "));
}
Run Code Online (Sandbox Code Playgroud)