প্রতিবিম্ব সহ একটি স্ট্যাটিক সম্পত্তি কীভাবে পাবেন


109

সুতরাং এটি বেশ বেসিক মনে হয় তবে আমি এটি কাজ করতে পারি না। আমার একটি অবজেক্ট রয়েছে এবং আমি এর সর্বজনীন বৈশিষ্ট্যগুলিতে পেতে প্রতিবিম্বটি ব্যবহার করছি। এই বৈশিষ্ট্যগুলির মধ্যে একটি স্থিতিশীল এবং এটিতে আমার ভাগ্য নেই।

Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
    Return obj.GetType.GetProperty(propName)

End Function

উপরের কোডটি পাবলিক ইনস্ট্যান্স বৈশিষ্ট্যগুলির জন্য সূক্ষ্মভাবে কাজ করে, যা এখনও অবধি আমার যা প্রয়োজন তা সমস্ত। মনে হয় আমি অন্যান্য ধরণের সম্পত্তি (ব্যক্তিগত, স্ট্যাটিক) অনুরোধ করার জন্য বাইন্ডিংফ্ল্যাগগুলি ব্যবহার করতে পারি, তবে আমি সঠিক সংমিশ্রণটি খুঁজে পাচ্ছি না বলে মনে হয়।

Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
    Return obj.GetType.GetProperty(propName, Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public)

End Function

কিন্তু তবুও, কোনও স্ট্যাটিক সদস্যকে অনুরোধ করে কিছু ফিরিয়ে দেওয়া হবে না। । নেট প্রতিফলক স্থিতিশীল বৈশিষ্ট্যগুলি ঠিক সূক্ষ্ম দেখতে পারে, সুতরাং স্পষ্টভাবে আমি এখানে কিছু অনুপস্থিত।


এই সত্যিই, সত্যিই এই অনুরূপ: stackoverflow.com/questions/392122/...
ctacke

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

উত্তর:


129

অথবা শুধু এটি দেখুন ...

Type type = typeof(MyClass); // MyClass is static class with static properties
foreach (var p in type.GetProperties())
{
   var v = p.GetValue(null, null); // static classes cannot be instanced, so use null...
}

2
এই দুটি নাল কোন ভেরিয়েবলের সাথে মিল রয়েছে? এটি সম্ভব হলে নামযুক্ত যুক্তি ব্যবহার করে এটি কীভাবে লিখবেন? ধন্যবাদ।
হামিশ গ্রুবিজন

অভ্যন্তরীণ স্থির শ্রেণীর জন্য?
কিকিনেট

এটি সেরা বিকল্প, আমার মতে এটি উত্তর হিসাবে নির্বাচন করা উচিত।
c0y0teX

8
p.GetValue(null);খুব কাজ করে। দ্বিতীয়টি nullপ্রয়োজন হয় না।
ক্রোনো

দুর্দান্ত লাগছে। নামটি যুক্তি অনুসারে সম্পত্তিটি অর্জনের লক্ষ্য ছিল - আমি মনে করি না যে এটি অর্জনের জন্য আমি চিরকালের সম্পত্তি থেকে লুপ করতে চাই।
কোরি ডাউনি

42

এটি সি #, তবে আপনাকে এই ধারণাটি দেওয়া উচিত:

public static void Main() {
    typeof(Program).GetProperty("GetMe", BindingFlags.NonPublic | BindingFlags.Static);
}

private static int GetMe {
    get { return 0; }
}

(আপনার কেবল অ-প্রজাতন্ত্র এবং স্ট্যাটিকের দরকার)


3
আমার ক্ষেত্রে, কেবলমাত্র এই দুটি পতাকা ব্যবহার করা কার্যকর হয়নি। আমাকে .ফ্ল্যাটেন হাইয়ার্কি পতাকাটিও ব্যবহার করতে হয়েছিল।
কোরি ডাউনি

3
@ কোরিডাউনি এতে সম্মত হয়েছে। BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchyআমার জন্য কাজ করা একমাত্র জিনিস ছিল।
জোনাথন রাইনহার্ট

40

একটু স্পষ্টতা ...

// Get a PropertyInfo of specific property type(T).GetProperty(....)
PropertyInfo propertyInfo;
propertyInfo = typeof(TypeWithTheStaticProperty)
    .GetProperty("NameOfStaticProperty", BindingFlags.Public | BindingFlags.Static); 

// Use the PropertyInfo to retrieve the value from the type by not passing in an instance
object value = propertyInfo.GetValue(null, null);

// Cast the value to the desired type
ExpectedType typedValue = (ExpectedType) value;

1
BindingFlags.Instance | BindingFlags.Staticএটা আমার জন্য সমাধান।
লসমানোস

28

ঠিক আছে তাই আমার জন্য চাবিকাঠিটি ছিল। ফ্লাটেন হাইয়ারচি বাইন্ডিংফ্ল্যাগ। আমি কেন জানি না কেন আমি কেবল এটি একটি কুঁচকে যুক্ত করেছি এবং এটি কাজ শুরু করে। সুতরাং চূড়ান্ত সমাধান যা আমাকে পাবলিক ইনস্ট্যান্স বা স্থিতিশীল সম্পত্তি পেতে অনুমতি দেয়:

obj.GetType.GetProperty(propName, Reflection.BindingFlags.Public _
  Or Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or _
  Reflection.BindingFlags.FlattenHierarchy)

7
myType.GetProperties(BindingFlags.Public | BindingFlags.Static |  BindingFlags.FlattenHierarchy);

এটি স্ট্যাটিক বেস শ্রেণিতে বা একটি নির্দিষ্ট ধরণের সমস্ত স্ট্যাটিক বৈশিষ্ট্য এবং সম্ভবত শিশুটিকেও ফিরিয়ে দেবে।


2

নির্ভরযোগ্যভাবে উপলভ্য নয় TypeInfoযেখানে BindingFlags(লক্ষ্য কাঠামোর উপর নির্ভর করে) - ভিত্তিতে নতুন প্রতিবিম্ব API ব্যবহার করার সময়, কেবল নিজের জন্য এটি পরিষ্কার করতে চেয়েছিলাম ।

'নতুন' প্রতিবিম্বে, কোনও ধরণের স্থির বৈশিষ্ট্য পেতে (বেস শ্রেণি (এস) সহ নয়) আপনাকে কিছু করতে হবে:

IEnumerable<PropertyInfo> props = 
  type.GetTypeInfo().DeclaredProperties.Where(p => 
    (p.GetMethod != null && p.GetMethod.IsStatic) ||
    (p.SetMethod != null && p.SetMethod.IsStatic));

কেবল পঠনযোগ্য বা কেবল লেখার জন্য উভয় বৈশিষ্ট্যের জন্য পরিবেশন করা (কেবল লেখার পক্ষে এক ভয়ঙ্কর ধারণা হয়েও)।

DeclaredPropertiesসদস্য, খুব পাবলিক / প্রাইভেট accessors সঙ্গে বৈশিষ্ট্য মধ্যে পার্থক্য করে না - তাই দৃশ্যমানতা প্রায় ফিল্টার করার পরে, অ্যাকসেসর আপনি ব্যবহার করতে হবে তার উপর ভিত্তি করে এটা করতে হবে। উদাহরণস্বরূপ - ধরে নিলাম উপরের কলটি ফিরে এসেছে, আপনি এটি করতে পারেন:

var publicStaticReadable = props.Where(p => p.GetMethod != null && p.GetMethod.IsPublic);

কিছু শর্টকাট পদ্ধতি উপলভ্য রয়েছে - তবে শেষ পর্যন্ত আমরা সকলেই TypeInfoভবিষ্যতে ক্যোয়ারী পদ্ধতি / বৈশিষ্ট্যগুলি সম্পর্কে আরও অনেকগুলি এক্সটেনশন পদ্ধতি লিখব । এছাড়াও, নতুন এআইপি আমাদের এখন থেকে 'বেসরকারী' বা 'পাবলিক' সম্পত্তি হিসাবে ঠিক কী ভাবেন সে সম্পর্কে ভাবতে বাধ্য করে - কারণ স্বতন্ত্র অ্যাক্সেসরগুলির ভিত্তিতে আমাদের অবশ্যই ফিল্টার করতে হবে।


1

নীচে আমার জন্য কাজ করে বলে মনে হচ্ছে।

using System;
using System.Reflection;

public class ReflectStatic
{
    private static int SomeNumber {get; set;}
    public static object SomeReference {get; set;}
    static ReflectStatic()
    {
        SomeReference = new object();
        Console.WriteLine(SomeReference.GetHashCode());
    }
}

public class Program
{
    public static void Main()
    {
        var rs = new ReflectStatic();
        var pi = rs.GetType().GetProperty("SomeReference",  BindingFlags.Static | BindingFlags.Public);
        if(pi == null) { Console.WriteLine("Null!"); Environment.Exit(0);}
        Console.WriteLine(pi.GetValue(rs, null).GetHashCode());


    }
}

-3

এই সি # প্রতিবিম্ব লিঙ্কটি চেষ্টা করুন।

দ্রষ্টব্য আমি মনে করি যে বাইন্ডিংফ্লাগস.ইনস্ট্যান্স এবং বাইন্ডিংফ্লাগস.স্ট্যাটিক একচেটিয়া।


হ্যাঁ, আমি আশা করছি যে এটি হবে না, কারণ আমি যা চাই তা আমি কোনও পাবলিক ইনস্ট্যান্স বা স্ট্যাটিক পেতে সক্ষম হতে চাই।
কোরি ডাউনি

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