Вы хотите, чтобы param
был общим (например, любым типом), и, вы ожидаете, что сможете называть его каким-то методом, правильно? Ну, вы можете увидеть проблему там: если param
может быть любого типа, нет способа гарантировать, что он будет иметь метод DoSomethingLikeSetValue
(или что-то еще). Я уверен, что вы могли бы прикинуться интроспекцией или принуждением типа времени исполнения, но я думаю, что «чистый» способ сделать то, что вы ищете, - это ограничить тип T
некоторым интерфейсом, который имеет необходимый метод (DoSomethingLikeSetValue
). Как это:
private static void QueueCheckNAdd<T>(ref T param, string input) where T : IHasSomething {
param.DoSomethingLikeSetValue(input);
}
public interface IHasSomething {
void DoSomethingLikeSetValue(string s);
}
Затем вы можете вызвать QueueCheckNAdd
обобщенно только если общий тип поддерживает интерфейс IHasSomething
. Таким образом, вы могли бы использовать его как это:
public class Foo : IHasSomething {
public void DoSomethingLikeSetValue(string s) {
Console.WriteLine(s);
}
}
var f = new Foo();
QueueCheckNAdd<Foo>(f, "hello");
Если 'T' будет только либо' int' или 'double', вы можете просто написать пару конкретных методов для выполнения преобразования с помощью' int.Parse() 'и' double.Parse() '. Ваш метод не является общим, если его можно использовать только с небольшим фиксированным набором типов. Использование конкретных методов также позволяет вам писать методы без приведения. – antiduh
Замечание: нет действительно хорошего способа ограничить общий тип 'int' /' double' - поэтому, если вы пишете код, который может быть использован, вам нужно проверить, что он может работать со всеми разрешенными типами. –
Я хотел подумать, что однажды мне придется приспособиться к разным типам. Я имел в виду, что прямо сейчас его привязаны только к типам данных int и double – CJC