QT: получить имя класса объекта

Вы можете использовать несколько методов для удаления элементов из массива:

//1
someArray.shift(); // first element removed
//2
someArray = someArray.slice(1); // first element removed
//3
someArray.splice(0, 1); // first element removed
//4
someArray.pop(); // last element removed
//5
someArray = someArray.slice(0, a.length - 1); // last element removed
//6
someArray.length = someArray.length - 1; // last element removed

Если вы хотите удалить элемент в позиции x, используйте:

someArray.splice(x, 1);

Или

someArray = someArray.slice(0, x).concat(someArray.slice(-x));

Ответ на комментарий @ chill182 : вы можете удалить один или несколько элементов из массива, используя Array.filter или Array.splice в сочетании с Array.findIndex (см. MDN ), например

// non destructive filter > noJohn = John removed, but someArray will not change
let someArray = getArray();
let noJohn = someArray.filter( el => el.name !== "John" ); 
log("non destructive filter > noJohn = ", format(noJohn));
log(`**someArray.length ${someArray.length}`);

// destructive filter/reassign John removed > someArray2 =
let someArray2 = getArray();
someArray2 = someArray2.filter( el => el.name !== "John" );
log("", "destructive filter/reassign John removed > someArray2 =", 
  format(someArray2));
log(`**someArray2.length ${someArray2.length}`);

// destructive splice /w findIndex Brian remains > someArray3 =
let someArray3 = getArray();
someArray3.splice(someArray3.findIndex(v => v.name === "Kristian"), 1);
someArray3.splice(someArray3.findIndex(v => v.name === "John"), 1);
log("", "destructive splice /w findIndex Brian remains > someArray3 =", 
  format(someArray3));
log(`**someArray3.length ${someArray3.length}`);

function format(obj) {
  return JSON.stringify(obj, null, " ");
}

function log(...txt) {
  document.querySelector("pre").textContent += `${txt.join("\n")}\n`
}

function getArray() {
  return [ {name: "Kristian", lines: "2,5,10"},
           {name: "John", lines: "1,19,26,96"},
           {name: "Brian", lines: "3,9,62,36"} ];
}
**Results**

22
задан Athari 7 September 2014 в 01:31
поделиться

4 ответа

Самый простой способ вызвать MyMethod, как говорит @Athari, использовать MakeGenericMethod. Поскольку он на самом деле не показывает, как это сделать, вот проверенный пример рабочего кода:

$obj = New-Object Sample

$obj.GetType().GetMethod("MyMethod").MakeGenericMethod([String]).Invoke($obj, "Test Message")
$obj.GetType().GetMethod("MyMethod").MakeGenericMethod([Double]).Invoke($obj, "Test Message")

с выводом

Generic type is System.String with argument Test Message
Generic type is System.Double with argument Test Message
14
ответ дан 29 November 2019 в 05:03
поделиться

Это ограничение PowerShell и не может быть сделано напрямую в PowerShell V1 или V2 AFAIK.

Кстати, ваш общий метод не является действительно общим. Не должно ли это быть:

public static string MyMethod<T>(T anArgument)
{ 
   return string.Format( "Generic type is {0} with argument {1}", 
                         typeof(T), anArgument.ToString()); 
} 

Если вы владеете этим кодом и хотите использовать его из PowerShell, избегайте универсальных методов или пишите не универсальный метод оболочки C #.

5
ответ дан 29 November 2019 в 05:03
поделиться

Хорошая новость заключается в том, что PowerShell v3 намного лучше связывается с универсальными методами (и изменяет их?), И вам часто не нужно делать ничего особенного, но вызывайте его, как обычный метод. Я не могу указать все критерии, для которых это теперь работает, но по моему опыту некоторые ситуации с общими параметрами все еще требуют обходных путей даже в PowerShell v4 (возможно, это существование или перегрузки или что-то подобное).

Точно так же у меня иногда возникают проблемы при передаче универсального параметра в метод ... например, при передаче параметра Func<T1, T2, TResult>.

Один из обходных путей, который для меня намного проще, чем MakeGenericMethod или другие подходы, состоит в том, чтобы просто поместить быстрый класс-оболочку C # прямо в мой скрипт и позволить C # сортировать все общие отображения ...

Вот пример такого подхода, который охватывает метод Enumerable.Zip. В этом примере мой класс c # вообще не является универсальным, но это строго не обязательно.

Add-Type @'
using System.Linq;
public class Zipper
{
    public static object[] Zip(object[] first, object[] second)
    {
        return first.Zip(second, (f,s) => new { f , s}).ToArray();
    }
}
'@
$a = 1..4;
[string[]]$b = "a","b","c","d";
[Zipper]::Zip($a, $b);

Это приводит к:

 f s
 - -
 1 a
 2 b
 3 c
 4 d

Я уверен, что есть более эффективные способы PowerShell, чтобы "сжать" два массива, но вы поймете идею. Реальная проблема, которую я избежал, заключалась в том, чтобы жестко закодировать (в классе C #) 3-й параметр в Zip, поэтому мне не пришлось выяснять, как передать это Func<T1, T2, TResult> (может быть, есть способ PowerShell для как это сделать?).

2
ответ дан 29 November 2019 в 05:03
поделиться

Быстрый путь, если нет конфликтов имен:

[Sample]::"MyMethod"("arg")
1
ответ дан 29 November 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: