2011-12-30 4 views
-1

Возможно ли это в любом случае (желательно без использования каких-либо сторонних библиотек), чтобы создать функцию, тип которой определяется во время выполнения на C#?Функция Тип параметра определяется во время выполнения?

например

public static void myfunc(var x) 
{ 
    System.Windows.Forms.MessageBox.Show(x); //just an example 
} 

ПРИМЕЧАНИЕ: Я хочу, чтобы среда выполнения, чтобы определить тип параметра и не хочу, чтобы потом бросить параметр другого типа, как это было бы необходимо, если я использую генерик. например, я не хочу:

myfunc<T>(T x) 
// and then : 
MessageBox.Show((string)m); 

UPDATE: Я на самом деле делает функцию парсер для my programming language, который переводит на C# код. На моем языке я хотел, чтобы типы параметров определялись во время выполнения всегда. Я искал хорошую функцию C# для удобного перевода. например в моем синтаксисом языка:

function msg << x 
    MessageBox.Show x 
end 

должна быть переведена на то, что не просили типа во время компиляции, но нужно бы один во время выполнения. например

public static void msg(var x) 
{ 
    System.Windows.Forms.MessageBox.Show(x); 
} 
+1

Почему вы продолжаете ссылаться на ** тип функции **, когда вы действительно имеете в виду ** тип параметра **? – Adam

+2

Вам не понадобится этот приведение, поскольку все объекты реализуют 'ToString()'. Кроме того, если вам нужно передать в строку ... тогда функция должна просто взять строку! Был бы признателен значимый пример. –

+0

@codesparkle извините, я набрал вопрос в спешке. – ApprenticeHacker

ответ

10

Ключевое слово введено для выполнения связывания в C# 4 является dynamic.

public static void myfunc(dynamic x) 

Это позволяет сделать предположения относительно х, которые бесконтрольно во время компиляции, но и не будет работать во время выполнения, если эти предположения окажутся недействительными.

public static void MakeTheDuckQuack(dynamic duck) 
{ 
    Console.WriteLine(duck.Quack()); 
} 

Предположение, сделанное здесь в том, что параметр будет иметь метод, названный Quack, который не принимает никаких аргументов и возвращает значение, которое затем может быть использовано в качестве аргумента Console.WriteLine. Если какое-либо из этих допущений недействительно, вы получите отказ во время выполнения.

Указанные классы определены как

class Duck 
{ 
    public string Quack() 
    { 
     return "Quack!"; 
    } 
} 

class FakeDuck 
{ 
    public string Quack() 
    { 
     return "Moo!"; 
    } 
} 

И метод вызывает

MakeTheDuckQuack(new Duck()); 
MakeTheDuckQuack(new FakeDuck()); 
MakeTheDuckQuack(42); 

Первые два успеха, как среда привязка прошла успешно, и третий результат в виде исключения, как System.Int32 не метод назван Quack.

Вообще говоря, вы бы хотели избежать этого, если это возможно, поскольку вы, по сути, утверждаете, что аргумент выполняет какой-то интерфейс без строгого определения. Если вы работаете в сценарии взаимодействия, то, возможно, это то, что вам нужно сделать. Если вы работаете с типами, которые вы контролируете, тогда вам лучше будет работать, пытаясь достичь безопасности времени компиляции через интерфейсы и/или базовые классы. Вы можете даже использовать разные стратегии (например, шаблон адаптера ), чтобы типы, которые вы не контролируете (или не можете изменить), соответствуют данному интерфейсу.

+0

+1, Спасибо, вы решили проблему. – ApprenticeHacker

+0

+1 для объяснения или почему * не * использовать его в большинстве сценариев и что делать вместо этого. – Adam

+1

+9001 для «moo» – Bengie

0

Вы можете использовать тип объекта или, если вы не знаете, сколько предметов доступно, вы можете использовать массив объектов params, то есть params object[] cParams.

2

Если вам нужно знать тип ... тогда вам нужно знать тип.Вы не можете получить свой торт и съесть его тоже.

Во-первых, отливка в вашем примере не нужна, поскольку все объекты реализуют ToString(). Вместо того, чтобы сообщать нам, что вы считаете нужным, расскажите нам, какую проблему вы пытаетесь решить. Существует почти наверняка решение либо с помощью дженериков, либо с использованием ключевого слова dynamic (хотя dynamic редко требуется), но нам нужна дополнительная информация. Если вы добавите больше, я обновлю этот ответ.

+0

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

Смежные вопросы