আমি কি অ্যারে বা অন্যান্য পরিবর্তনশীল সংখ্যক আর্গুমেন্টের সাহায্যে একটি সি # বৈশিষ্ট্যটি আরম্ভ করতে পারি?


105

পরিবর্তনশীল সংখ্যক তর্ক যুক্ত করে প্রাথমিকভাবে তৈরি করা যায় এমন একটি বৈশিষ্ট্য তৈরি করা কি সম্ভব?

উদাহরণ স্বরূপ:

[MyCustomAttribute(new int[3,4,5])]  // this doesn't work
public MyClass ...

12
আপনার অ্যারেতে ভুল রয়েছে কেবল ভুলতে। এটি "নতুন ইনট [] {3,4,5}" হওয়া উচিত।
ডেভিড ওয়েঙ্গিয়ার

উত্তর:


178

বৈশিষ্ট্যগুলি একটি অ্যারে নেবে। আপনি যদি বৈশিষ্ট্যটি নিয়ন্ত্রণ করেন তবে আপনি তার paramsপরিবর্তে ব্যবহার করতে পারেন (যা গ্রাহকদের কাছে ভাল, আইএমও):

class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }

    public MyCustomAttribute(params int[] values) {
       this.Values = values;
    }
}

[MyCustomAttribute(3, 4, 5)]
class MyClass { }

অ্যারে তৈরির জন্য আপনার বাক্য গঠনটি কেবল বন্ধ হয়ে যায়:

class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }

    public MyCustomAttribute(int[] values) {
        this.Values = values;
    }
}

[MyCustomAttribute(new int[] { 3, 4, 5 })]
class MyClass { }

33

আপনি এটি করতে পারেন, তবে এটি সিএলএস অনুগত নয়:

[assembly: CLSCompliant(true)]

class Foo : Attribute
{
    public Foo(string[] vals) { }
}
[Foo(new string[] {"abc","def"})]
static void Bar() {}

শো:

Warning 1   Arrays as attribute arguments is not CLS-compliant

নিয়মিত প্রতিবিম্ব ব্যবহারের জন্য, একাধিক বৈশিষ্ট্য থাকা পছন্দনীয় হতে পারে, যেমন

[Foo("abc"), Foo("def")]

যাইহোক, এটি TypeDescriptor/ এর সাথে কাজ করবে না PropertyDescriptor, যেখানে কেবলমাত্র কোনও বৈশিষ্ট্যের একক দৃষ্টান্ত সমর্থিত (প্রথম বা শেষ জয়, আমি কোনটি স্মরণ করতে পারি না)।


3
দ্রষ্টব্য: একাধিক বৈশিষ্ট্যের জন্য আপনার অ্যাট্রিবিউটে একটি অ্যাট্রিবিউট ইউজেজ অ্যাট্রিবিউট প্রয়োজন। stackoverflow.com/questions/553540/...
russau

23

কনস্ট্রাক্টরকে এভাবে ঘোষণা করার চেষ্টা করুন:

public class MyCustomAttribute : Attribute
{
    public MyCustomAttribute(params int[] t)
    {
    }
}

তারপরে আপনি এটি ব্যবহার করতে পারেন:

[MyCustomAttribute(3, 4, 5)]


12

এটা ঠিক করা উচিত। বৈশিষ্ট থেকে, বিভাগ 17.2:

নিম্নোক্ত সমস্ত বিবৃতি যদি সত্য হয় তবে একটি এক্সপ্রেশন ই একটি অ্যাট্রিবিউট-আর্গুমেন্ট-এক্সপ্রেশন :

  • E এর ধরণটি একটি বিশিষ্ট প্যারামিটার ধরণ (§17.1.3)।
  • সংকলন-সময়, E এর মান নীচের একটির মধ্যে সমাধান করা যেতে পারে:
    • একটি ধ্রুবক মান।
    • একটি সিস্টেম। টাইপ অবজেক্ট।
    • একটি এক-মাত্রিক বিন্যাসের বৈশিষ্ট্য-যুক্তি-এক্সপ্রেশন

এখানে একটি উদাহরণ:

using System;

[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class SampleAttribute : Attribute
{
    public SampleAttribute(int[] foo)
    {
    }
}

[Sample(new int[]{1, 3, 5})]
class Test
{
}

5
সিএলএস সম্মতিতে
নজর রাখুন

4

হ্যাঁ, তবে আপনি যে অ্যারেটি দিয়ে যাচ্ছেন তা আপনাকে আরম্ভ করতে হবে our আমাদের ইউনিট পরীক্ষাগুলির একটি সারি পরীক্ষা থেকে একটি উদাহরণ যা ভেরিয়েবল কমান্ড লাইন বিকল্পের পরীক্ষা করে;

[Row( new[] { "-l", "/port:13102", "-lfsw" } )]
public void MyTest( string[] args ) { //... }

2

আপনি এটি করতে পারেন। আর একটি উদাহরণ হতে পারে:

class MyAttribute: Attribute
{
    public MyAttribute(params object[] args)
    {
    }
}

[MyAttribute("hello", 2, 3.14f)]
class Program
{
    static void Main(string[] args)
    {
    }
}

1

মার্ক গ্রাভেলের উত্তরে পিগি ফিরে যাওয়ার জন্য, হ্যাঁ আপনি অ্যারে প্যারামিটারগুলির সাহায্যে একটি বৈশিষ্ট্য নির্ধারণ করতে পারেন তবে অ্যারে প্যারামিটারের সাথে একটি অ্যাট্রিবিউট প্রয়োগ করা সিএলএস-সম্মতিযুক্ত নয়। তবে কেবলমাত্র অ্যারের বৈশিষ্ট্যের সাথে একটি বৈশিষ্ট্য নির্ধারণ করা পুরোপুরি সিএলএস-সম্মতিযুক্ত।

আমাকে এই বিষয়টি বুঝতে পেরেছিল যে জেএসন.এনইটি, একটি সিএলএস-কমপ্লায়েন্ট লাইব্রেরি, আইটেম কনভার্টারপ্যারামিটার নামের একটি সম্পত্তি সহ একটি গুণযুক্ত জেসনপ্রোপার্টিঅ্যাট্রিবিউট রয়েছে যা এই বস্তুর একটি অ্যারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.