常に機能するソリューションではありませんが、これでほとんどの場合は機能します。
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 を起動するたびに、一度ビルドする必要があります。それだけです。