কোনও শ্রেণীর সমস্ত বৈশিষ্ট্য কীভাবে লুপ করবেন?


168

আমার একটা ক্লাস আছে

Public Class Foo
    Private _Name As String
    Public Property Name() As String
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property

    Private _Age As String
    Public Property Age() As String
        Get
            Return _Age
        End Get
        Set(ByVal value As String)
            _Age = value
        End Set
    End Property

    Private _ContactNumber As String
    Public Property ContactNumber() As String
        Get
            Return _ContactNumber
        End Get
        Set(ByVal value As String)
            _ContactNumber = value
        End Set
    End Property


End Class

আমি উপরের শ্রেণীর বৈশিষ্ট্যগুলি লুপ করতে চাই। যেমন;

Public Sub DisplayAll(ByVal Someobject As Foo)
    For Each _Property As something In Someobject.Properties
        Console.WriteLine(_Property.Name & "=" & _Property.value)
    Next
End Sub

উত্তর:


297

প্রতিবিম্ব ব্যবহার:

Type type = obj.GetType();
PropertyInfo[] properties = type.GetProperties();

foreach (PropertyInfo property in properties)
{
    Console.WriteLine("Name: " + property.Name + ", Value: " + property.GetValue(obj, null));
}

এক্সেলের জন্য - তালিকায় কোনও "সিস্টেম.পরিচয়" এন্ট্রি না থাকায় বাইন্ডিংফ্লাগগুলিতে অ্যাক্সেস পেতে কোন সরঞ্জাম / রেফারেন্স আইটেমটি যুক্ত করতে হবে

সম্পাদনা করুন: আপনি এখানে একটি বাইন্ডিংফ্ল্যাজ মান নির্দিষ্ট করতে পারেন type.GetProperties():

BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
PropertyInfo[] properties = type.GetProperties(flags);

এটি প্রত্যাবর্তিত বৈশিষ্ট্যগুলিকে সর্বজনীন দৃষ্টান্তের বৈশিষ্ট্যগুলিতে সীমাবদ্ধ রাখবে (স্থির বৈশিষ্ট্য, সুরক্ষিত বৈশিষ্ট্যগুলি বাদ দিয়ে) exc

আপনার নির্দিষ্ট করার দরকার নেই , কোনও সম্পত্তির মূল্য পাওয়ার জন্য BindingFlags.GetPropertyকল type.InvokeMember()করার সময় আপনি এটি ব্যবহার করেন।


বিটিডব্লিউ, সেই গেটপোপার্টি পদ্ধতির জন্য কিছু বাঁধাই পতাকা থাকা উচিত নয়? পছন্দ BindingFlags.Public | BindingFlags.GetPropertyনাকি কিছু?
Svish

@ সুইশ, আপনি ঠিক বলেছেন :) এটি কিছু বাইন্ডিং ফ্ল্যাগ ব্যবহার করতে পারে তবে সেগুলি alচ্ছিক। আপনি সম্ভবত পাবলিক চান দৃষ্টান্ত.
ব্রানন

টিপ: আপনি যদি স্থির ক্ষেত্র নিয়ে কাজ করে থাকেন তবে কেবল এখানে নাল দিন: সম্পত্তি.GetValue (নাল);
অ্যালানসিকিরা 27

42

মনে রাখবেন যে আপনি যে অবজেক্টের কথা বলছেন তাতে যদি কাস্টম প্রপার্টি মডেল থাকে (যেমন DataRowViewইত্যাদি DataTable), তবে আপনাকে ব্যবহার করা দরকার TypeDescriptor; সুসংবাদটি হ'ল এটি নিয়মিত ক্লাসগুলির জন্য এখনও দুর্দান্ত কাজ করে (এবং এটি প্রতিবিম্বের চেয়েও দ্রুত হতে পারে ):

foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj)) {
    Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue(obj));
}

এটি TypeConverterবিন্যাসকরণের মতো জিনিসগুলিতেও সহজে অ্যাক্সেস সরবরাহ করে :

    string fmt = prop.Converter.ConvertToString(prop.GetValue(obj));

32

ব্রাননের দেওয়া সি # এর ভিবি সংস্করণ:

Public Sub DisplayAll(ByVal Someobject As Foo)
    Dim _type As Type = Someobject.GetType()
    Dim properties() As PropertyInfo = _type.GetProperties()  'line 3
    For Each _property As PropertyInfo In properties
        Console.WriteLine("Name: " + _property.Name + ", Value: " + _property.GetValue(Someobject, Nothing))
    Next
End Sub

লাইন নং 3 এর পরিবর্তে বাইন্ডিং ফ্ল্যাগ ব্যবহার করা

    Dim flags As BindingFlags = BindingFlags.Public Or BindingFlags.Instance
    Dim properties() As PropertyInfo = _type.GetProperties(flags)

ধন্যবাদ, ভিবিতে রূপান্তর করতে আমার অনেক বেশি সময় লেগেছিল :)
ব্র্যানন

আপনি সর্বদা একটি স্বয়ংক্রিয় রূপান্তরকারী ব্যবহার করতে পারেন, ওয়েবে প্রচুর পরিমাণে রয়েছে :)
বেলেক্সান্দ্রে

1
হ্যাঁ তবে হ্যান্ড কোডিংয়ের মতো সব ঠিক নেই। একটি উল্লেখযোগ্য হ'ল টেল্রিক কোড রূপান্তরকারী
শচীন চাওয়ান

এখানে কীভাবে টেলরিক
shmup

7

প্রতিবিম্বটি বেশ "ভারী"

সম্ভবত এই সমাধানটি চেষ্টা করে দেখুন: // সি #

if (item is IEnumerable) {
    foreach (object o in item as IEnumerable) {
            //do function
    }
} else {
    foreach (System.Reflection.PropertyInfo p in obj.GetType().GetProperties())      {
        if (p.CanRead) {
            Console.WriteLine("{0}: {1}", p.Name, p.GetValue(obj,  null)); //possible function
        }
    }
}

'VB.Net

  If TypeOf item Is IEnumerable Then

    For Each o As Object In TryCast(item, IEnumerable)
               'Do Function
     Next
  Else
    For Each p As System.Reflection.PropertyInfo In obj.GetType().GetProperties()
         If p.CanRead Then
               Console.WriteLine("{0}: {1}", p.Name, p.GetValue(obj, Nothing))  'possible function
          End If
      Next
  End If

প্রতিচ্ছবি প্রতিদিনের জিনিসের পারফরম্যান্সে দেখানো একটি পদ্ধতি কলের গতি +/- 1000 x গতি কমিয়ে দেয়


2

একটি লিনকুই ল্যাম্বদা ব্যবহার করে এটি করার আরও একটি উপায় এখানে রয়েছে:

সি #:

SomeObject.GetType().GetProperties().ToList().ForEach(x => Console.WriteLine($"{x.Name} = {x.GetValue(SomeObject, null)}"));

VB.NET:

SomeObject.GetType.GetProperties.ToList.ForEach(Sub(x) Console.WriteLine($"{x.Name} = {x.GetValue(SomeObject, Nothing)}"))

1

এইভাবেই আমি এটি করি।

foreach (var fi in typeof(CustomRoles).GetFields())
{
    var propertyName = fi.Name;
}

1
যদি অবজেক্ট / শ্রেণিতে ক্ষেত্রগুলির পরিবর্তে বৈশিষ্ট্য থাকে তবে গেটফিল্ডগুলির () পরিবর্তে গেটপ্রেটিস () ব্যবহার করুন।
গারডাভিস

0
private void ResetAllProperties()
    {
        Type type = this.GetType();
        PropertyInfo[] properties = (from c in type.GetProperties()
                                     where c.Name.StartsWith("Doc")
                                     select c).ToArray();
        foreach (PropertyInfo item in properties)
        {
            if (item.PropertyType.FullName == "System.String")
                item.SetValue(this, "", null);
        }
    }

আমি উপরের কোড ব্লকটি ব্যবহার করেছি আমার ওয়েব ব্যবহারকারীর নিয়ন্ত্রণ অবজেক্টের সমস্ত স্ট্রিং বৈশিষ্ট্য পুনরায় সেট করতে যা "ডক" দিয়ে নাম শুরু হয়েছে।

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