2013-02-20 29 views
0

我已經編寫了一個反射工具來分析我們的數據模型的界面層次結構。如何將視覺體面的視覺工作室風格的字符串轉換爲類型

在我的自定義類中,我有一個List<Type>,其中包含我想要顯示的所有屬性。我寫了一個PropertyWrapper類,使我更容易很好地顯示這些特定的屬性:

public class PropertyWrapper 
{ 
    public PropertyInfo PropertyInfo { get; set; } 
    public string PropertyType { get; set; } 
    public string PropertyName { get; set; } 

    public PropertyWrapper(PropertyInfo propertyInfo) 
    { 
     PropertyInfo = propertyInfo; 

     if (propertyInfo != null) 
     { 
      PropertyNameString = propertyInfo.Name; 

      if (propertyInfo.PropertyType.IsGenericType) 
       PropertyTypeString = propertyInfo.PropertyType.FullName.Split('`').First().Split('.').Last() 
            + "<" 
            + propertyInfo.PropertyType.GenericTypeArguments.First() 
                .FullName.Split('.') 
                .Last() 
            + ">"; 
      else 
       PropertyTypeString = propertyInfo.PropertyType.FullName.Split('.').Last(); 
     } 
    } 
} 

我的XAML是這樣的:

<DataTemplate DataType="PropertyWrapper"> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding PropertyType}" FontWeight="Bold" /> 
     <TextBlock Text="{Binding PropertyName}" Margin="5 0 0 0" /> 
    </StackPanel> 
</DataTemplate> 

我的目標是能夠顯示在某些屬性Visual Studio風格。問題不在於屬性名稱,更可能是PropertyType,它看起來像這樣(.ToString()):System.Collections.Generic.IList'1[System.Object]。但我想要的是這樣一個字符串:IList<Object>(實際上是IList<object>,但我們不要太完美)。

我的問題是,由於我經常執行此代碼,是否有更高效/優雅的方式來實現這一目標?我在想,如果我們的代碼庫變得越來越大,這個反射代碼可能不會擴展。

我也很樂意批評這個反射代碼,因爲我對反射很陌生。它在哪裏可能會失敗,我可以在哪裏編寫更安全的代碼?它不是生產代碼,只是開發人員的工具。

關於代碼的一點要說,反映的是,沒有任何泛型類型具有多個泛型參數。

編輯

關於計算器代碼塊格式的一個小問題。我能否以某種方式轉義內聯代碼塊中的「`」字符?不是將它用作代碼塊初始值設定項,而是作爲我文本中的普通字符,它幾乎搞亂了我的格式。

回答

1

我不會太在意「字符串處理」的速度。

反射操作要慢得多,所以要專注於如何縮短這個時間。

可以使用2做法:

1)使用反射只裝配使用加​​載(這是更快:

Assembly.ReflectionOnlyLoad() 
Assembly.ReflectionOnlyLoadFrom() 

2)使用裝配獨特的簽名緩存結果和結果保存到文件(即使用序列化),所以你不需要重新加載已經解析的集合。

希望這有助於

+0

我從來沒有使用過序列化。這是否意味着,只要代碼發生變化,程序集的唯一簽名就會改變?所以我不需要保持緩存的東西與程序集的代碼結構同步? – 2013-02-20 13:25:35

+0

不,序列化用於以特定格式(即xml文件)保存對象(和嵌套屬性)。一旦你保存了它,你可以使用反序列化來檢索它。請參閱XmlSerializator類,例如 – 2013-02-20 13:32:40

+0

是的,程序集的簽名更改。您可以使用散列算法來計算簽名並檢查更改。 – 2013-02-20 13:35:44