Я пытаюсь создать функцию в C#, которая позволит мне при вызове вернуть ссылку на данный тип класса. Единственные типы таких функций, которые я видел, находятся в UnrealScript, и даже тогда функциональность жестко закодирована в его компилятор. Мне интересно, могу ли я сделать это на C#. Вот что я имею в виду (фрагмент кода из исходного кода UnrealScript):Ограничение класса и архетипы
native(278) final function actor Spawn
(
class<actor> SpawnClass,
optional actor SpawnOwner,
optional name SpawnTag,
optional vector SpawnLocation,
optional rotator SpawnRotation
);
Теперь в UScript вы могли бы назвать это так ...
local ActorChild myChildRef; //Ref to ActorChild which Extends 'actor'
myChildRef = Spawn(class'ActorChild' ...); //rest of parameters taken out
myChildRef.ChildMethod(); //method call to method existing inside class 'ActorChild'
Который будет возвращать ссылку на объект класса «ActorChild 'и установите для него значение переменной myChildRef. Мне нужно сделать что-то подобное в C#.
Я искал Generics, но кажется, что для их использования мне нужно создать instace класса, где находится моя функция, и передать ему «общий» параметр. Это не очень желательно, так как мне не нужно будет использовать функцию «Spawn» для определенных классов, но мне все равно придется добавлять общий параметр к классу всякий раз, когда я его использую.
Я предполагаю, что будет упрощенный вопрос, как я могу вернуть тип, который я не знаю во время компиляции, и когда разные классы могут быть слишком много, чтобы ловушки.
Псевдо-код (прилипание к именам UScript класса, то есть актер):
//Function Sig
public class<Actor> Create(class<Actor> CreatedClass)
{
return new CreatedClass;
}
//Function call
ActorChild myChild = Create(class'ActorChild');
Любые идеи?
EDIT: Я хотел бы избежать явных приемов типов, которые возникли бы из вызова класса Created. Если я могу привести к желаемому объекту в методе «Создать» и вернуть «неизвестный тип», что бы это ни было, я был бы очень счастлив.
EDIT 2: Спасибо за ваши ответы.
не страдает ли проблема «Type.GetType только смотрит в mscorlib»? – Jimmy 2008-11-02 06:08:43
Действительно ли это? Я понимаю, что если вы поместите имя сборки после имени типа, оно будет выглядеть и в других сборках. См. Документацию для AssemblyQualifiedName в MSDN. – 2008-11-02 07:21:57