簡體   English   中英

使用自定義 TypeDescriptionProvider 仍然是在 VS2012 設計器中使用通用表單的唯一方法嗎?

[英]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 設計抽象表單

通用表單和 VS 設計器

這仍然是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM