C#: Ограничение Типов в параметрах метода (не универсальные параметры)

Можно использовать вычисляемые свойства, а не методы, если расчеты не занимают заметного времени

См. Рекомендации по использованию свойства

.

9
задан kpozin 20 May 2009 в 03:15
поделиться

6 ответов

Если ваш метод должен принимать тип типа в качестве аргумента, я не думаю, что есть способ сделать это. Если у вас есть гибкость с вызовом метода, вы можете сделать: public void Foo (MyClass myClass) и получить Тип, вызвав .GetType ().

Чтобы немного расширить. System.Type - это тип аргумента, поэтому нет возможности указать, что следует передать. Так же, как метод, который принимает целое число от 1 до 10, должен принимать int, а затем во время выполнения проверять правильность соблюдения ограничений.

9
ответ дан 4 December 2019 в 13:49
поделиться

Если указать тип MyClass или производный от него, - это проверка значения самого аргумента. Это все равно, что сказать, что параметр приветствия в

void Foo(int hello) {...}

должен быть от 10 до 100. Невозможно проверить во время компиляции.

Вы должны использовать универсальные шаблоны или проверять тип во время выполнения, как и любая другая проверка значения параметра.

3
ответ дан 4 December 2019 в 13:49
поделиться

Вы можете использовать следующее:

public void Foo<T>(T variable) where T : MyClass
{ ... }

Вызов будет примерно таким:

{
    ...
    Foo(someInstanceOfMyClass);
    ...
}
2
ответ дан 4 December 2019 в 13:49
поделиться

почему бы вам не использовать вместо

public void foo<t>();

?

0
ответ дан 4 December 2019 в 13:49
поделиться

Теоретически то, что вы хотите, можно сделать с помощью атрибутов. Но это намного яснее (imo) и делает то же самое:

public void Foo(MyClass m) {
   Type t = m.GetType();
   // ...
}
1
ответ дан 4 December 2019 в 13:49
поделиться

You can also use an extension method, which will be available for all objects convertible to MyClass:

public static class MyClassExtensions
{
    public static void Foo(this MyClass obj)
    {
       // ...
    }
}

And you can use it as if it were an ordinary method of an object:

var x = new MyClass();
x.Foo();
0
ответ дан 4 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

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