2013-08-23 2 views
0

Есть ли способ вывести интерфейс из объекта по его типу. Например, если у меня был следующий объект:Infer интерфейс по типу во время компиляции

public class Person 
{ 
    public string FirstName 
    { get; set; } 

    public string LastName 
    { get; set; } 
} 

Я хотел бы быть в состоянии вывести этот интерфейс:

public interface IPerson 
{ 
    string FirstName 
    { get; set; } 

    string LastName 
    { get; set; } 
} 

То, что я хотел бы сделать, это быть в состоянии создать общий прокси-завод, используя reflection.emit, который придерживается намеченного интерфейса во время компиляции. Я знаю, что вместо этого я мог бы вернуть динамический объект со всеми свойствами объекта, но все это обрабатывается во время выполнения и компиляции.

Редактировать

Чуть больше объяснений за то, что я пытаюсь добиться. Я хочу, чтобы создать прокси-класс, который имеет метод с подписью что-то вроде этого:

public T GetProxyFor<U>(U SomeObject); 

Таким образом, пользователь может позвонить GetProxyFor (People) и получить обратно объект PeopleProxy, который будет реализовывать свойства Народа объекта (или любой другой объект). Таким образом, кто-то, использующий этот код, может вызвать PeopleProxy.LastName, и это будет успешно скомпилировано, но вызов PeopleProxy.Age приведет к ошибке при компиляции, поскольку он не существует.

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

+4

Какая у вас задание? Вы пытаетесь создать генератор кода, который создает этот интерфейс в качестве кода? Или вы пытаетесь построить интерфейс «на лету» внутри исполняемого кода? Или что-то другое? –

+1

Я рекомендую T4 для этого. –

+0

@JoeEnos, я добавил редактирование оригинального сообщения, которое, надеюсь, объяснит мой вопрос более подробно. – divinebovine

ответ

1

В принципе, то, что вы просите, это выполнить код, который создает интерфейс во время компиляции.

варианты:

  1. Используйте что-то вроде T4. Вы можете использовать это для генерации кода C# на основе некоторого ввода во время компиляции.
  2. Используйте поставщиков типа F #. Это в основном то, что вы хотите: он может выполнять код во время компиляции и генерировать интерфейс сразу, когда вы пишете код, который вызывает GetProxyFor(). Но в C# ничего подобного нет, поэтому вам потребуется переключиться на F # (по крайней мере, на часть вашего кода, которая использует GetProxyFor()).
  3. Подумайте об основной проблеме, стоящей за этим вопросом (которую вы нам не сказали), и решите ее по-другому.
Смежные вопросы