c# একক বৈশিষ্ট্যে একাধিক বৈশিষ্ট্যের সংমিশ্রণ



.net winforms (1)

একটি নিয়ন্ত্রণে আমি একাধিক বৈশিষ্ট্যযুক্ত বৈশিষ্ট্য ব্যবহার করছি:

[Browsable(false)]
[Bindable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Obsolete("", true)]
public new Boolean AllowDrop;

আমি সেই বৈশিষ্ট্যগুলি অন্যান্য অন্যান্য নিয়ন্ত্রণ বৈশিষ্ট্যগুলিতেও ব্যবহার করছি।

আমি ভাবছি প্রতিটি সময় লেখার কোডের পরিমাণ হ্রাস করার কোনও উপায় আছে কিনা?

আমি এই জাতীয় একাধিক বৈশিষ্ট্য একত্রিত করতে পারলে এটি দুর্দান্ত হবে:

[Hidden(true)]
public new Boolean AllowDrop;

যেখানে Hidden সম্পত্তি উপরের সমস্ত বৈশিষ্ট্য অন্তর্ভুক্ত করবে। সুতরাং কোডের একমাত্র লাইন রয়েছে is

সম্ভবত ম্যাক্রো বা কিছুতে বৈশিষ্ট্যগুলি একত্রিত করারও একটি উপায় আছে?

আমি সচেতন যে সম্পত্তি গোপন করার অন্যান্য উপায় আছে তবে আমি গুণাবলীর ব্যবহারের উপায়টি বেছে নিয়েছি।

ধন্যবাদ


বৈশিষ্ট্যগুলির সংমিশ্রণটি প্রসঙ্গের জন্য অর্থবোধক হতে পারে যা বৈশিষ্ট্যগুলি ব্যবহার করে এবং ব্যাখ্যা করে। উদাহরণস্বরূপ সেই প্রসঙ্গে যা ব্যবহার করে। নেট টাইপ বর্ণনা পদ্ধতি আপনি ধরণের বিবরণটি কাস্টমাইজ করতে পারেন যা নেট ভোক্তাদের কাছে ফিরে আসে।

স্ট্যান্ডার্ড ব্যবহার করে প্রকারের জন্য কাস্টম মেটাডেটা সরবরাহ করা সম্ভব that সেই উদ্দেশ্যে নেট ব্যবস্থার জন্য, আপনার অবজেক্টের জন্য একটি পছন্দসই ধরণের বর্ণনাকারী নিবন্ধকরণ করুন।

ধারণাটি এভাবে কাজ করবে, আপনি নিজের ধরণের জন্য একটি পছন্দসই ধরণের বিবরণী তৈরি করুন। কাস্টম ধরণের বর্ণনাকারীতে, আপনি আপনার ধরণের বৈশিষ্ট্যের জন্য কাস্টম সম্পত্তি বিবরণকারী এবং সম্পত্তি বর্ণনাকারীটিতে ফিরে আসেন, আপনি সম্পত্তির জন্য কাস্টম বৈশিষ্ট্যের একটি কাস্টম সেট ফিরিয়ে দেন।

পদ্ধতির আরও কোড প্রয়োজন, তবে এটি সত্যিই আকর্ষণীয় এবং আপনার প্রকারের জন্য কাস্টম মেটাডেটা কীভাবে সরবরাহ করবেন সে সম্পর্কে কিছুটা ভাল ধারণা ভাগ করে নেয়:

ইমিডিয়েটাএট্রিবিউট ইন্টারফেস

ব্যবহারটি মেটাডেটাঅ্যাট্রিবিউটগুলি তৈরি করার জন্য একটি মানক উপায় সরবরাহ করছে। এই ইন্টারফেসটি প্রয়োগ করে এমন প্রতিটি বৈশিষ্ট্য মেটাডেটা হিসাবে ব্যবহার করা হবে এবং বৈশিষ্ট্যের পরিবর্তে, এটি Process পদ্ধতিতে ফিরে আসে Process ব্যবহৃত হবে:

public interface IMetadatAttribute
{
    Attribute[] Process();
}

নমুনা মেটাডেটাঅ্যাট্রিবিউট

এটি একটি নমুনা মেটাডেটা অ্যাট্রিবিউট যা বৈশিষ্ট্যটি প্রক্রিয়া করার সময় কিছু বৈশিষ্ট্য ফেরত দেয়:

public class MySampleMetadataAttribute : Attribute, IMetadatAttribute
{
    public Attribute[] Process()
    {
        var attributes = new Attribute[]{ 
            new BrowsableAttribute(false),
            new EditorBrowsableAttribute(EditorBrowsableState.Never), 
            new BindableAttribute(false),
            new DesignerSerializationVisibilityAttribute(
                    DesignerSerializationVisibility.Hidden),
            new ObsoleteAttribute("", true)
        };
        return attributes;
    }
}

সম্পত্তি বর্ণনাকারী

এই শ্রেণিটি সম্পত্তির জন্য বৈশিষ্ট্যের একটি কাস্টম তালিকা সরবরাহ করতে কাস্টম ধরণের বর্ণনাকারী দ্বারা ব্যবহৃত হবে:

public class MyPropertyDescriptor : PropertyDescriptor
{
    PropertyDescriptor original;
    public MyPropertyDescriptor(PropertyDescriptor originalProperty)
        : base(originalProperty) { original = originalProperty;}
    public override AttributeCollection Attributes
    {
        get
        {
            var attributes = base.Attributes.Cast<Attribute>();
            var result = new List<Attribute>();
            foreach (var item in attributes)
            {
                if(item is IMetadatAttribute)
                {
                    var attrs = ((IMetadatAttribute)item).Process();
                    if(attrs !=null )
                    {
                        foreach (var a in attrs)
                            result.Add(a);
                    }
                }
                else
                    result.Add(item);
            }
            return new AttributeCollection(result.ToArray());
        }
    }
    // Implement other properties and methods simply using return original
    // The implementation is trivial like this one:
    // public override Type ComponentType
    // {
    //     get { return original.ComponentType; }
    // }
}

টাইপ বর্ণনাকারক

এটি হ'ল ধরণ বিবরণকারী যা আপনার ধরণের জন্য একটি কাস্টম বিবরণ সরবরাহ করে। এই উদাহরণে এটি আপনার শ্রেণীর বৈশিষ্ট্যের জন্য কাস্টম বৈশিষ্ট্যগুলি সেট করে কাস্টম সম্পত্তি বর্ণনাকারী ব্যবহার করে:

public class MyTypeDescriptor : CustomTypeDescriptor
{
    ICustomTypeDescriptor original;
    public MyTypeDescriptor(ICustomTypeDescriptor originalDescriptor)
        : base(originalDescriptor)
    {
        original = originalDescriptor;
    }
    public override PropertyDescriptorCollection GetProperties()
    {
        return this.GetProperties(new Attribute[] { });
    }
    public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    {
        var properties = base.GetProperties(attributes).Cast<PropertyDescriptor>()
                             .Select(p => new MyPropertyDescriptor(p))
                             .ToArray();
        return new PropertyDescriptorCollection(properties);
    }
}

টাইপডেস্ক্রিপ্টর সরবরাহকারী

এই শ্রেণিটি আপনার প্রকারের উপরের বৈশিষ্ট্যটিতে ব্যবহৃত কাস্টম টাইপ বর্ণনাকারী প্রবর্তনের জন্য ব্যবহৃত হবে যা আমরা এই ধরণের মেটাডেটা ইঞ্জিন হিসাবে তৈরি করেছি:

public class MyTypeDescriptionProvider : TypeDescriptionProvider
{
    public MyTypeDescriptionProvider()
        : base(TypeDescriptor.GetProvider(typeof(object))) { }

    public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType,
                                                            object instance)
    {
       ICustomTypeDescriptor baseDescriptor = base.GetTypeDescriptor(objectType, instance);
       return new MyTypeDescriptor(baseDescriptor);
    }
}

নমুনা ক্লাস

এখানে আমার নমুনা শ্রেণি যা এর Name সম্পত্তিটি MySampleMetadataAttribute ব্যবহার করে সজ্জিত এবং ক্লাসটি আমাদের কাস্টম ধরণের বর্ণনাকারী সরবরাহকারীর ব্যবহার করতে নিবন্ধীকৃত:

[TypeDescriptionProvider(typeof(MyTypeDescriptionProvider))]
public class MySampleClass
{
    public int Id { get; set; }
    [MySampleMetadataAttribue]
    [DisplayName("My Name")]
    public string Name { get; set; }
}

ফলাফলটি দেখার জন্য এটি শ্রেণীর একটি উদাহরণ তৈরি করতে এবং PropertyGrid ফলাফলটি দেখার পক্ষে যথেষ্ট:

var o = new MySampleClass();
this.propertyGrid1.SelectedObject = o;

উত্তরে কিছু নোট

  • সম্ভবত আপনি যেমন কাজের জন্য প্রত্যাশা হিসাবে এত সহজ নয়। কিন্তু এটি কাজ করছে।
  • এটি একটি দীর্ঘ উত্তর, তবে আপনি কাস্টম মেটাডেটা সরবরাহ করতে কীভাবে আপনার ধরণের টাইপ বর্ণনাকারী প্রয়োগ করতে পারেন তার একটি সম্পূর্ণ কার্যকারী উদাহরণ রয়েছে।
  • প্রকারটি এমন ইঞ্জিনগুলির জন্য কাজ করবে না যা ধরণের বর্ণনার পরিবর্তে প্রতিবিম্ব ব্যবহার করে। তবে এটি পুরোপুরি উদাহরণস্বরূপ PropertyGrid নিয়ন্ত্রণ নিয়ে কাজ করছে যা ধরণের বিবরণ দিয়ে কাজ করে।




windows-forms-designer