有没有办法动态创建类型的属性名称,同时保持设计时智能感知?

时间:2009-07-09 14:57:58

标签: .net visual-studio generics

最简单的例子是内置类keyValuePair(T,U)。我希望能够根据使用情况对键属性和值属性进行不同的命名,并且设计时intellisense会显示这些名称而不是键和值。这可以通过反射完成。发射?它可以用另一种方式完成吗?

这看起来像一个小范围,只能保存1类8行代码,但它对更复杂的类有更广泛的含义。

作为另一个例子,我希望能够写新的

Dim item as  KeyValuePair (of string, string)("LoanNumber", "LoanApplicationID") 

KeyValuePair<string,string>("LoanNumber","LoanApplicationID") item;

并通过以下方式访问intellisense:

var result=item.LoanNumber;

每次我需要一个具有自定义属性名称的类型时,无需在代码中创建以下类:

class LoanInfo
{
  string LoanNumber{get;set;}
  string LoanApplicationID{get;set;}
}

不要因为使用keyValuePair而挂断它,例如它因为它的功能接近我想要的功能,但是不允许我设置属性名称。

这可能吗?

3 个答案:

答案 0 :(得分:1)

您可以这样使用anonymous types。我知道VS2008 / C#会理解这些属性并用Intellisense给你它们,并且假设它在VB中是相同的,但是我没有在VB中编程所以YMMV。

Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

Dim name as string 

name = product.Name

您看到的最常见的地方之一是LINQ。

Dim namePriceQuery = From prod In products _
                     Select prod.Name, prod.Price

Dim firstName as string

firstName = namePriceQuery.First().Name

答案 1 :(得分:0)

不,你不能。原因是它是动态的,不仅不能用intellisense它不能编译,因为你试图引用的属性不存在。

我建议你以你不想要的方式创建它:

class LoanInfo{  string LoanNumber{get;set;}  string LoanApplicationID{get;set;}}

我会说你创建了一个可以继承属性的接口。但你仍然需要对集合进行编码并获得。

答案 2 :(得分:0)

目前没有办法做到这一点,因为没有匿名的命名类型。但是,使用DevExpress(coderush / refactor pro),您可以创建一个示例匿名类型,并将其重构为实际类。我猜resharper也可以做到。