Вывод интерфейса по типу во время компиляции

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

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, который реализует свойства объекта People (или любого другого объекта). Таким образом, кто-то, использующий этот код, может вызвать PeopleProxy.LastName, и это будет успешно скомпилировано, но вызов PeopleProxy.Age приведет к ошибке при компиляции, поскольку он не существует.

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


person divinebovine    schedule 23.08.2013    source источник
comment
Какова именно ваша цель? Вы пытаетесь создать генератор кода, который создает этот интерфейс в виде файла кода? Или вы пытаетесь построить интерфейс на лету внутри работающего кода? Или что-то другое?   -  person Joe Enos    schedule 23.08.2013
comment
Я рекомендую T4 для этого.   -  person Federico Berasategui    schedule 23.08.2013
comment
@JoeEnos, я добавил правку в исходный пост, которая, надеюсь, более подробно объясняет мой вопрос.   -  person divinebovine    schedule 23.08.2013
comment
Если ваши типы выглядят так, не лучше ли написать интерфейс, а затем создать класс во время выполнения?   -  person svick    schedule 23.08.2013
comment
Я намеренно использовал простой объект только в иллюстративных целях. Я планирую, что мой прокси будет использоваться повсеместно, поэтому интерфейсы не могут быть написаны для каждого варианта использования.   -  person divinebovine    schedule 24.08.2013


Ответы (1)


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

Ваши варианты:

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