Создание метода, в котором одним из параметров может быть массив или строка - PullRequest
1 голос
/ 20 сентября 2019

Я конвертирую старый классический метод 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

А вот как я думалэто может быть преобразовано в 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;
    }

Intellisense сообщает мне, что я не могу получить свойство длины или выполнить его итерацию.Я подозреваю, что даже если бы он считался массивом, он рассматривается как объект.Любая помощь будет оценена.

Ответы [ 2 ]

5 голосов
/ 20 сентября 2019

"Одним из параметров может быть массив или строка. Какой тип переменной я объявляю?"

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} "));
}
5 голосов
/ 20 сентября 2019

Как Алексей напоминает мне в комментариях, это должна быть пара перегрузок методов, без приведения ни к одному из них:

    public static bool security(string UserID, string Action, string[] details)
    public static bool security(string UserID, string Action, string details)

Вы должны написать это таким образом, если вам позволено.

В имеющейся версии, если вам нужно, чтобы это работало, вам нужно разыграть ее.Вы не можете обрабатывать ссылку на объект типа напрямую как строку или массив, даже если фактический объект, на который он ссылается, фактически является одной из этих вещей.Вы должны явно указать компилятору, что вы хотите.В этом случае мы также хотим спросить во время выполнения, каков фактический тип ссылочного объекта.

Я не знаю, какой ваш массив может быть массивом из , но любой массив не является универсальным 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";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...