আমি এমন লোকদের জন্য কিছু টিপস পেয়েছি যারা বলে যে TypeDescriptionProviderজুয়ান কার্লোস ডিয়াজ লিখেছেন যে কাজ করছে না এবং শর্তসাপেক্ষ সংকলনও পছন্দ করে না:
প্রথমত, ফর্ম ডিজাইনারে কাজ করার জন্য আপনার কোডের পরিবর্তনের জন্য আপনাকে ভিজ্যুয়াল স্টুডিও পুনরায় চালু করতে হতে পারে (আমার ছিল, সাধারণ পুনর্নির্মাণটি কার্যকর হয়নি - বা প্রতিবার নয়)।
আমি বিমূর্ত বেস ফর্ম ক্ষেত্রে আমার এই সমস্যার সমাধানটি উপস্থাপন করব। ধরা যাক আপনার একটি BaseFormক্লাস রয়েছে এবং আপনি চান এর উপর ভিত্তি করে যে কোনও ফর্ম ডিজাইনেযোগ্য হতে পারে (এটি হবে Form1)। TypeDescriptionProviderযেমন জুয়ান কার্লোস ডিয়াজ দ্বারা উপস্থাপিত আমার জন্য কাজ করে নি। এখানে আমি মিডল ক্লাস সমাধান (গন্ধ দ্বারা) এর সাথে যুক্ত হয়ে এটি কীভাবে কাজ করেছি তা শর্তযুক্ত সংকলন ছাড়াই#if DEBUG এবং কিছু সংশোধন করে:
[TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider<BaseForm, BaseFormMiddle2>))]
public abstract class BaseForm : Form
{
public BaseForm()
{
InitializeComponent();
}
public abstract void SomeAbstractMethod();
}
public class Form1 : BaseForm
{
public Form1()
{
InitializeComponent();
}
public override void SomeAbstractMethod()
{
}
}
বেসফর্ম ক্লাসে বৈশিষ্ট্যটি লক্ষ্য করুন Notice তারপরে আপনাকে কেবল দুটিTypeDescriptionProvider এবং দুটি মধ্যবিত্ত শ্রেণির ঘোষণা করতে হবে, তবে চিন্তা করবেন না, তারা ফর্ম 1 এর বিকাশকারীদের জন্য অদৃশ্য এবং অপ্রাসঙ্গিক । প্রথমটি বিমূর্ত সদস্যদের প্রয়োগ করে (এবং বেস শ্রেণিকে বিমূর্ত করে তোলে)। দ্বিতীয়টি খালি - এটি কেবল ভিএস ফর্ম ডিজাইনারের কাজ করা প্রয়োজন। তারপর আপনি নির্ধারণ দ্বিতীয় থেকে মধ্যবিত্ত TypeDescriptionProviderএর BaseForm। কোনও শর্তসাপেক্ষ সংকলন নেই।
আমার আরও দুটি সমস্যা ছিল:
- সমস্যা 1: ডিজাইনারে ফর্ম 1 পরিবর্তন করার পরে (বা কিছু কোড) এটি আবার ত্রুটি দিচ্ছিল (আবার ডিজাইনারে এটি খোলার চেষ্টা করার সময়)।
- সমস্যা 2: বেস ফর্মের নিয়ন্ত্রণগুলি ভুলভাবে স্থাপন করা হয়েছিল যখন ফর্ম 1 এর আকার ডিজাইনারে পরিবর্তন করা হয়েছিল এবং ফর্মটি বন্ধ করে ফর্ম ডিজাইনারটিতে আবার খোলা হয়েছিল।
প্রথম সমস্যা (আপনার এটি নাও থাকতে পারে কারণ এটি এমন কিছু যা আমার প্রকল্পে আরও কয়েকটি জায়গায় আমাকে হান্ট করে এবং সাধারণত "টাইপ এক্সকে টাইপ এক্স তে রূপান্তর করতে পারে না" ব্যতিক্রম উত্পন্ন করে)। আমি এর মধ্যে মীমাংসিত TypeDescriptionProviderদ্বারা টাইপ নামের তুলনা (FULLNAME) পরিবর্তে ধরনের তুলনা (নিচে দেখুন)।
দ্বিতীয় সমস্যা। আমি জানি না কেন বেস ফর্মটির নিয়ন্ত্রণগুলি ফর্ম 1 শ্রেণিতে ডিজাইনযোগ্য নয় এবং আকারগুলি পরিবর্তন করার পরে তাদের অবস্থানগুলি হারিয়ে গেছে, তবে আমি এটি প্রায় কাজ করেছি (একটি দুর্দান্ত সমাধান নয় - আপনি যদি আরও ভাল জানেন তবে দয়া করে লিখুন)। আমি কেবল বেসফর্মের বোতামগুলি (যা নীচে-ডান কোণে থাকা উচিত) বেসফর্মের লোড ইভেন্ট থেকে অ্যাসিঙ্ক্রোনিকভাবে অনুরোধ করা পদ্ধতিতে তাদের সঠিক অবস্থানগুলিতে ম্যানুয়ালি সরিয়ে নিয়েছি: BeginInvoke(new Action(CorrectLayout));আমার বেস শ্রেণিতে কেবল "ঠিক আছে" এবং "বাতিল" বোতাম রয়েছে, তাই কেস সহজ।
class BaseFormMiddle1 : BaseForm
{
protected BaseFormMiddle1()
{
}
public override void SomeAbstractMethod()
{
throw new NotImplementedException();
}
}
class BaseFormMiddle2 : BaseFormMiddle1
{
}
এবং এখানে আপনার সামান্য পরিবর্তিত সংস্করণ রয়েছে TypeDescriptionProvider:
public class AbstractControlDescriptionProvider<TAbstract, TBase> : TypeDescriptionProvider
{
public AbstractControlDescriptionProvider()
: base(TypeDescriptor.GetProvider(typeof(TAbstract)))
{
}
public override Type GetReflectionType(Type objectType, object instance)
{
if (objectType.FullName == typeof(TAbstract).FullName)
return typeof(TBase);
return base.GetReflectionType(objectType, instance);
}
public override object CreateInstance(IServiceProvider provider, Type objectType, Type[] argTypes, object[] args)
{
if (objectType.FullName == typeof(TAbstract).FullName)
objectType = typeof(TBase);
return base.CreateInstance(provider, objectType, argTypes, args);
}
}
এবং এটাই!
আপনার বেসফর্মের ভিত্তিতে ফর্মগুলির ভবিষ্যত বিকাশকারীদের আপনাকে কিছু ব্যাখ্যা করতে হবে না এবং তাদের ফর্মগুলি ডিজাইন করার জন্য তাদের কোনও কৌশল করতে হবে না! আমি মনে করি এটি সবচেয়ে পরিষ্কার সমাধান হতে পারে (নিয়ন্ত্রণের স্থিতিস্থাপকতা বাদে)।
আরও একটি টিপ:
কিছু কারণে ডিজাইনার এখনও আপনার জন্য কাজ করতে রাজি থাকে, তাহলে আপনি সবসময় পরিবর্তনের সহজ কৌতুক করতে পারেন public class Form1 : BaseFormথেকে public class Form1 : BaseFormMiddle1(অথবা BaseFormMiddle2কোড ফাইলে), বনাম ফর্ম ডিজাইন ব্যবস্থার মধ্যে সম্পাদনার এবং তারপর ফিরে আবার পরিবর্তন। আমি এই কৌশলটি শর্তসাপেক্ষ সংকলনের চেয়ে বেশি পছন্দ করি কারণ এটি ভুল সংস্করণটি ভুলে যাওয়ার এবং প্রকাশের সম্ভাবনা কম ।