Почему бы не предоставить свой API обработки напрямую, с перегрузками для различных параметров?
public class MyClass
{
public void Process(string Value) { // implementation }
public void Process(int Value) { // implementation }\
public void Process(MyClass Value) { // implementation }
public void Process(object Value) { // catch all method. Handle unknown entities, e.g. call ToString() }
}
EDIT С помощью некоторой универсальной магии вы можете иметь один метод интерфейса, набор вспомогательных методовкоторые выполняют работу, и один метод всеобщего охвата, где вы обрабатываете угловые случаи.
public class MyClass
{
void DoProcess(string Value) { // implementation }
void DoProcess(int Value) { // implementation }\
void DoProcess(MyClass Value) { // implementation }
void DoProcess(object Value) {
// catch all method. Handle unknown entities, e.g. call ToString()
}
public void Process<T>(T value) {
//this method will call the right overload of DoProcess depending on the compile time type of value. If there isn't a match, it goes to DoProcess(object)
DoProcess(value);
}
}
Таким образом, вы избегаете бокса для фундаментальных типов и немного улучшаете безопасность типов.весь метод, который вы можете попробовать использовать Type.IsAssignableFrom
метод.Например:
if (typeof(short).IsAssignableFrom(Value)
DoProcess((short)Value);
if (typeof(byte).IsAssignableFrom(Value)
DoProcess((byte)Value);
Я рекомендую вам прочитать эссе Эрика Липперта о представительных ролях.Надеемся, что после этого вы поймете, что может быть проще иметь перегрузку для каждого поддерживаемого типа.Кроме того, вы можете понять, что работа с распакованными типами значений может стать дорогой в ад.