创建一个方法,其中参数之一可以是数组或字符串

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属性或无法对其进行迭代。我怀疑即使认为它可能以数组形式出现,也将其视为对象。任何帮助,将不胜感激。

15e*_*153 5

正如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)


Ruf*_*s L 5

“参数之一可以是数组或字符串。我声明什么类型的变量?”

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)