[英]Is using a custom TypeDescriptionProvider still the only way around using generic forms in the designer for VS2012?
我有從通用基本表單繼承並按預期執行的表單,但是它們沒有顯示在設計器中。
我在網上搜索並在 SO 上找到了一些問題,還有一些博客文章說要使用自定義 TypeDescriptionProvider。 我發現的文章大約是 2008-2010 年。
使用 Visual Studio Whidbey 設計抽象表單
這仍然是 2013 年 9 月使用 VS2012、.NET 4.0 的方法嗎?
許多人聲稱使用 TypeDescriptionProvider 的相同機制適用於抽象基類應該適用於泛型,但是我還沒有遇到任何真正讓它工作的人。
我花了幾個小時試圖讓基於 TypeDescriptionProvider 的解決方案適用於通用基類,但是與抽象基類不同,設計者似乎沒有嘗試使用指定的類型描述符提供程序(通過使用一個 VS 實例進行調試來驗證)另一個 VS 實例的設計器)。
有可能讓它工作,但屬性解決方案在一般情況下不能開箱即用。 甚至 OP 參考文章的作者(似乎是從這里逐字復制的)在評論中也承認他沒有對其進行泛型測試。
有人有運氣嗎?
不是一直有效的解決方案,但這在大多數情況下都可以:
class GenericControlDescriptionProvider : TypeDescriptionProvider
{
public GenericControlDescriptionProvider()
: base(TypeDescriptor.GetProvider(typeof(ContainerControl)))
{
}
public override Type GetReflectionType(Type objectType, object instance)
{
if (objectType.IsGenericType)
{
return objectType.BaseType;
}
return base.GetReflectionType(objectType, instance);
}
public override object CreateInstance(IServiceProvider provider, Type objectType, Type[] argTypes, object[] args)
{
if (objectType.IsGenericType)
{
objectType = objectType.BaseType;
}
return base.CreateInstance(provider, objectType, argTypes, args);
}
}
我要檢查的只是目標類型是否是通用的,如果是,則使用其基類。 這里的假設是基類對於設計者來說是一個合適的可實例化類。 一個例子:
[TypeDescriptionProvider(typeof(GenericControlDescriptionProvider))]
public abstract class FormBase<TViewModel> : Form
已針對 VS 2017、.NET 4.5.2 進行測試。 問題是解決方案(閱讀演示項目)必須在 VS 進程的生命周期內構建一次。 每次啟動VS,都需要構建一次,僅此而已。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.