2013-08-23 21 views
0

有没有什么方法可以根据对象的类型来推断对象的接口。举例来说,如果我有以下对象:在编译时按类型推断接口

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(人),并得到一个PeopleProxy对象将实现人民的对象的属性(或任何其他物体)。这样,使用此代码的人可以调用PeopleProxy.LastName,并且这将成功编译,但对PeopleProxy.Age的调用在编译后会导致错误,因为它不存在。

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

+4

你的目标是什么?你是否试图构建一个代码生成器来创建该接口作为代码文件?或者你是否试图在运行代码的内部构建一个接口?或者是其他东西? –

+1

我推荐T4。 –

+0

@JoeEnos,我在原始文章中添加了一个编辑,希望更详细地解释我的问题。 – divinebovine

回答

1

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

的选项有:

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