Обновление 3 : ОК, так как у вас все в порядке с уродливым решением, вы можете проверить недокументированные __refvalue
и __makeref
ключевые слова .
Похоже, ваша проблема в том, что вы хотите указать тип ref object
параметра, который будет преобразован или изменен в.
Проблема в том, что вы не можете просто произвольно назначить переменную любого типа T
, например, string
.Таким образом, вам нужно будет передать ref object
или ref string
, чтобы это сработало на всех .
Мне кажется, что oberfreak прибито к тому, чтовы пытались достичь (я изначально не заметил, что вы инициализировали o
как string
и, таким образом, явно хотели, чтобы его фактический тип влиял на поведение функции Test2
).Его ответ имеет правильный подход для вас.
Обновление : вы упоминаете в комментарии, что вы пытаетесь иметь динамическое поведение, которое может быть достигнуто с помощью словаря.Я предполагаю, что это выглядит примерно так?
Обновление 2 : обновлено Этот пример основан на Ваш обновленный пример.
public static class TypeHandler // note: get rid of generic T parameter
{
delegate void ProcessDelegate(ref object obj); // again, not generic
static Dictionary<Type, ProcessDelegate> processors = new Dictionary<Type, ProcessDelegate>()
{
{ typeof(string), (ref object obj) => { obj = "Hello, world!"; } }
// etc.
};
public static void Process(ref object obj)
{
processors[obj.GetType()].Invoke(ref obj);
}
}
То, что должно работать.Но вы не можете достичь того же самого с помощью дженериков, потому что нет способа сделать это (как вы знаете):
// not allowed
// |
// -----------
// | |
TypeHandler<o.GetType()>.Process(ref o);
Если бы было , то вы были бы всезадавать.Но единственный возможный способ сделать это - использовать рефлексию, которая уродлива и дорогостоящая для чего-то подобного, и это явно помешает вашему намерению сохранить эту простоту и обеспечить хорошую производительность.