在编译时按类型推断接口

时间:2013-08-23 18:00:12

标签: c# interface reflection.emit

有没有办法根据对象的类型推断出对象的接口。例如,如果我有以下对象:

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的调用会在编译时导致错误,因为它不存在。

我对于反射和发射是相当新的,所以我想要的可能是不可能的。

1 个答案:

答案 0 :(得分:1)

基本上,您要求的是执行一些在编译时创建接口的代码。

您的选择是:

  1. 使用像T4这样的东西。您可以使用它在编译时基于某些输入生成C#代码。
  2. 使用F#类型提供程序。这基本上就是你想要的:它可以在编译时执行代码,并在你编写调用GetProxyFor()的代码时生成接口。但是在C#中没有类似的东西,因此它需要您切换到F#(至少对于使用GetProxyFor()的代码部分而言)。
  3. 想想这个问题背后的根本问题(你没有告诉我们)并以另一种方式解决它。