我已經編寫了一個反射工具來分析我們的數據模型的界面層次結構。如何將視覺體面的視覺工作室風格的字符串轉換爲類型
在我的自定義類中,我有一個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>
,但我們不要太完美)。
我的問題是,由於我經常執行此代碼,是否有更高效/優雅的方式來實現這一目標?我在想,如果我們的代碼庫變得越來越大,這個反射代碼可能不會擴展。
我也很樂意批評這個反射代碼,因爲我對反射很陌生。它在哪裏可能會失敗,我可以在哪裏編寫更安全的代碼?它不是生產代碼,只是開發人員的工具。
關於代碼的一點要說,反映的是,沒有任何泛型類型具有多個泛型參數。
編輯
關於計算器代碼塊格式的一個小問題。我能否以某種方式轉義內聯代碼塊中的「`」字符?不是將它用作代碼塊初始值設定項,而是作爲我文本中的普通字符,它幾乎搞亂了我的格式。
我從來沒有使用過序列化。這是否意味着,只要代碼發生變化,程序集的唯一簽名就會改變?所以我不需要保持緩存的東西與程序集的代碼結構同步? – 2013-02-20 13:25:35
不,序列化用於以特定格式(即xml文件)保存對象(和嵌套屬性)。一旦你保存了它,你可以使用反序列化來檢索它。請參閱XmlSerializator類,例如 – 2013-02-20 13:32:40
是的,程序集的簽名更改。您可以使用散列算法來計算簽名並檢查更改。 – 2013-02-20 13:35:44