Вам нужно использовать отражение, чтобы начать использовать метод, а затем «построить» его, предоставив аргументы типа MakeGenericMethod :
MethodInfo method = typeof(Sample).GetMethod("GenericMethod");
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);
. Для статического метода, pass null
в качестве первого аргумента Invoke
. Это не имеет никакого отношения к универсальным методам - это просто нормальное отражение.
Как уже отмечалось, многое из этого проще с C # 4 с использованием dynamic
- если вы можете использовать вывод типа, конечно. Это не помогает в случаях, когда вывод типа недоступен, например, точный пример в вопросе.
LValues рекомендуют избежаться. Они - забава и все, но они смущают новых пользователей, которые делают предположения о том, как работают все нижние индексы, и таким образом нужно избежать в коде, когда лучший путь доступен.
Иногда это может быть чрезвычайно практично для использования результата LValue, чтобы сделать грязную работу.
substr( $string, $start, $stop ) = 'somevalue' # replaces the specified part of the substring.
Однако это также делает то же самое:
substr( $string, $start, $stop , 'somevalue' );
различие, здесь являющееся главным образом, первый имеет значительно более выразительную власть, поскольку это делегирует поведение к коду, который использует его вместо самой функции.
, Например:
substr( $string, $start, $stop ) =~ s/a/b/g
потребовал бы, чтобы Вы сделали
my $x = substr( $string, $start, $stop );
$x =~ s/a/b/g/;
substr( $string, $start, $stop, $x );
, Который немного противен.
, Хотя, существует дополнительное противное здесь, потому что необходимо думать о том, делать ли ли ту замену или нет с $x, работает задним числом для изменения строки или не (из-за substr быть LValue sub). Я не думаю, что это делает, но Его достаточно неоднозначное, которое я должен проверить руководство, чтобы помнить, делает ли это или нет, и это плохо.
Можно использовать lvalue нижние индексы в качестве методов set для элементов объекта:
sub x : lvalue {
my $self = shift;
$self->{x};
}
Затем позже:
$foo->x = 5;
Это комбинирует интуицию установки участников непосредственно с гибкостью инкапсуляции метода set, в случае, если Вы позже хотите измениться, как объект реализован. Сравните со следующими более традиционными путями к элементам множества в Perl:
Интуитивный, но хрупкий; что, если Вы изменяетесь, как $foo реализован?
$foo->{x} = 5;
Традиционный метод установщика; не использует синтаксис присвоения для какой суммы к присвоению:
$foo->set_x(5);
, Конечно, lvalue методы действительно никогда не охватывались сообществом Perl, и использование lvalue нижних индексов является "странным" и независимо от того, что было бы получено для интуиции, будет потерян странностью всего этого.
Они обеспечивают другой интерфейс, который при некоторых обстоятельствах может быть более интуитивным. В отличие от традиционных методов set, можно на самом деле изменить значение непосредственно. Например
lvalue_sub($foo) =~ s/foo/bar/;
может быть более чистым, чем
my $tmp = some_sub($foo);
$tmp =~ s/foo/bar/;
some_sub($foo, $tmp);