স্ট্রিং হিসাবে সম্পত্তি নাম পান


203

(আমি গৃহীত উত্তরটি ব্যবহার করে নীচের সমাধানটি দেখুন)

আমি প্রতিবিম্বিত কিছু কোডের রক্ষণাবেক্ষণের উন্নতি করার চেষ্টা করছি। অ্যাপ্লিকেশনটির প্রকাশিত দূরবর্তী ইন্টারফেসের অন্তর্ভুক্ত নয় এমন অ্যাপের অংশগুলি অ্যাক্সেস করার জন্য এক্সিকিউট নামক একটি পদ্ধতি রয়েছে .NET রিমোটিং ইন্টারফেস এক্সপোজিং (অন্যান্য জিনিসের মধ্যে) has

অ্যাপ্লিকেশনটি কীভাবে বৈশিষ্ট্যগুলি নির্ধারণ করে (এই উদাহরণের মধ্যে একটি স্থিতিশীল) যা নির্বাহের মাধ্যমে অ্যাক্সেসযোগ্য হবে বোঝানো হয়েছে:

RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");

সুতরাং একটি দূরবর্তী ব্যবহারকারী কল করতে পারে:

string response = remoteObject.Execute("SomeSecret");

অ্যাপ্লিকেশনটি সামারক্লাস.সোমপ্রোপার্টি খুঁজে পেতে এবং তার মানটিকে স্ট্রিং হিসাবে ফিরিয়ে দিতে প্রতিবিম্বটি ব্যবহার করবে।

দুর্ভাগ্যক্রমে, কেউ যদি সাম্প্রোপার্টিটির নাম পরিবর্তন করে এবং এক্সপোজপ্রপার্টি () এর 3 য় পার্ম পরিবর্তন করতে ভুলে যায় তবে তা এই প্রক্রিয়াটিকে ভেঙে দেয়।

এর সমতুল্য আমার দরকার:

SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()

এক্সপোজপ্রপার্টিতে 3 য় পারম হিসাবে ব্যবহার করতে যাতে রিফ্যাক্টরিং সরঞ্জামগুলি পুনরায় নামগুলির যত্ন নেবে।

এই কাজ করতে একটি উপায় আছে কি? আগাম ধন্যবাদ.

ঠিক আছে, এখানে আমি কী তৈরি করে শেষ করেছি (আমার নির্বাচিত উত্তর এবং তিনি যে প্রশ্নটি উল্লেখ করেছেন তার উপর ভিত্তি করে):

// <summary>
// Get the name of a static or instance property from a property access lambda.
// </summary>
// <typeparam name="T">Type of the property</typeparam>
// <param name="propertyLambda">lambda expression of the form: '() => Class.Property' or '() => object.Property'</param>
// <returns>The name of the property</returns>
public string GetPropertyName<T>(Expression<Func<T>> propertyLambda)
{
    var me = propertyLambda.Body as MemberExpression;

    if (me == null)
    {
        throw new ArgumentException("You must pass a lambda of the form: '() => Class.Property' or '() => object.Property'");
    }

    return me.Member.Name;
 }

ব্যবহার:

// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);

// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);

এখন এই দুর্দান্ত ক্ষমতা সহ, এক্সপোজপ্রপার্টি পদ্ধতিটি সহজ করার সময় time ডোরকনবগুলি পলিশ করা বিপজ্জনক কাজ ...

ধন্যবাদ সবাইকে.


9
এটি সত্যই প্রশমিত হয়েছে যে আপনি আপনার সমাধান যুক্ত করেছেন এবং জিনিসগুলি বেঁধে দিয়েছেন।
সহজভাবে জি।


উত্তর হিসাবে আপনার সমাধানটি যুক্ত করা উচিত - এটি আপনার গৃহীত উত্তরের চেয়ে অনেক বেশি সংক্ষিপ্ততর।
কেনি এভিট

1
@ কেনি এভিট: সম্পন্ন:)
জিম সি

@ জিমসি উপভোগ! এবং বর্তমানে গৃহীত উত্তরের একটি মন্তব্যে লিঙ্কযুক্ত । ধন্যবাদ!
কেনি এভিট

উত্তর:


61

এখান থেকে গেটমেবারআইনফো ব্যবহার করে: ল্যাম্বডা এক্সপ্রেশন থেকে সম্পত্তির নাম পুনরুদ্ধার করা আপনি এরকম কিছু করতে পারেন:

RemoteMgr.ExposeProperty(() => SomeClass.SomeProperty)

public class SomeClass
{
    public static string SomeProperty
    {
        get { return "Foo"; }
    }
}

public class RemoteMgr
{
    public static void ExposeProperty<T>(Expression<Func<T>> property)
    {
        var expression = GetMemberInfo(property);
        string path = string.Concat(expression.Member.DeclaringType.FullName,
            ".", expression.Member.Name);
        // Do ExposeProperty work here...
    }
}

public class Program
{
    public static void Main()
    {
        RemoteMgr.ExposeProperty("SomeSecret", () => SomeClass.SomeProperty);
    }
}

এটা সম্পূর্ণ দুর্দান্ত। দেখে মনে হচ্ছে এটি কোনও সম্পত্তি ধরণের ক্ষেত্রেও কাজ করবে।
জিম সি

আমি এটি উভয় উদাহরণ এবং স্থির বৈশিষ্ট্য দিয়ে চেষ্টা করেছি। এ পর্যন্ত সব ঠিকই.
জিম সি

এমন কোনও ধারণা যেখানে আমি সমাবেশ বা নিউগেট প্যাকেজ ধারণ করতে GetMemberInfoপারি? মাইক্রোসফ্ট এন্টারপ্রাইজ লাইব্রেরির জন্য 'সাধারণ ইউটিলিটিস' প্যাকেজটির সাথে আমি কিছুই খুঁজে পাচ্ছি না, যা এমএসডিএন বলে মনে হয় যে সেই পদ্ধতিটি রয়েছে। এখানে একটি "আনুষ্ঠানিক" প্যাকেজ রয়েছে তবে আনুষ্ঠানিক হওয়া অপ্রয়োজনীয়। জিমসির উত্তর , যা এটির উপর ভিত্তি করে তৈরি হয়েছে, তা আরও সংক্ষিপ্ত এবং আপাতদৃষ্টিতে অনুপলব্ধ গ্রন্থাগারের উপর নির্ভর করে না।
কেনি এভিট

1
@ কেনেভিট, তিনি যে পদ্ধতিটি উল্লেখ করছেন সেটি হ'ল তিনি যে প্রশ্নটি যুক্ত করেছেন তার লেখক লিখেছেন। বিকল্প যে methodyou এই Type.GetMembers ব্যবহার করতে পারেন msdn.microsoft.com/en-us/library/...
উপভোগ

464

সি # 6.0 এর সাহায্যে এটি এখন একটি নন-ইস্যু হিসাবে আপনি করতে পারেন:

nameof(SomeProperty)

এই প্রকাশটি সংকলন-সময়ে সমাধান করা হয় "SomeProperty"

Nameof এর MSDN ডকুমেন্টেশন


18
এটি মডেলস্টেট.এডডমডেল ইরর কলগুলির জন্য খারাপ এবং খুব দরকারী।
মাইকেল সিলভার

9
এবং এটি একটি const string! আশ্চর্যজনক
জ্যাক

4
@ রেডেনকোর নিশ্চিত, আপনি যদি মাইক্রোকন্ট্রোলারের হয়ে লিখছেন তবে আপনার সি এর মতো নিম্ন স্তরের ভাষা ব্যবহার করা উচিত এবং যদি আপনাকে চিত্র এবং ভিডিও প্রসেসিংয়ের মতো প্রতিটি বিট পারফর্মেন্স গ্রাস করতে হয় তবে আপনার সি বা সি ++ ব্যবহার করা উচিত। তবে অন্যান্য 95% অ্যাপ্লিকেশনগুলির জন্য, একটি পরিচালিত কোড কাঠামো যথেষ্ট দ্রুত হবে। পরিণামে সি # মেশিন কোডেও সংকলিত হয় এবং আপনি চাইলে আপনি এটি স্থানীয় ভাষায় প্রাক-সংকলন করতে পারেন।
সোশি আশের

2
যাইহোক, @ রাইডেনকোর, আপনি যে অ্যাপ্লিকেশনগুলি উল্লেখ করেছেন সেগুলি সি # এর পূর্বাভাস দেয়, সে কারণেই সেগুলি সি ++ এ লেখা হয়েছে। সেগুলি যদি আজ লেখা হয় তবে কে কোন ভাষাটি ব্যবহৃত হত তা কে জানে। উদাহরণস্বরূপ পেইন্ট.এনইটি দেখুন।
সোশি আশের

1
RaisePropertyআপনি ডাব্লুপিএফ-এ যেতে চাইলে এটি সত্যিই দরকারী ! RaisePropertyChanged ("সম্পত্তি") এর পরিবর্তে RaisePropertyChanged (nameof (संपत्ति)) ব্যবহার করুন
পিয়েরে

17

ল্যাম্বডা এক্সপ্রেশন থেকে এটিকে বের করার জন্য একটি সুপরিচিত হ্যাক রয়েছে (এটি এমভিভিএম ফাউন্ডেশনে জোশ স্মিথের প্রপার্টিঅবার্সার ক্লাস থেকে এসেছে):

    private static string GetPropertyName<TPropertySource>
        (Expression<Func<TPropertySource, object>> expression)
    {
        var lambda = expression as LambdaExpression;
        MemberExpression memberExpression;
        if (lambda.Body is UnaryExpression)
        {
            var unaryExpression = lambda.Body as UnaryExpression;
            memberExpression = unaryExpression.Operand as MemberExpression;
        }
        else
        {
            memberExpression = lambda.Body as MemberExpression;
        }

        Debug.Assert(memberExpression != null, 
           "Please provide a lambda expression like 'n => n.PropertyName'");

        if (memberExpression != null)
        {
            var propertyInfo = memberExpression.Member as PropertyInfo;

            return propertyInfo.Name;
        }

        return null;
    }

দুঃখিত, এটি কিছু প্রসঙ্গ অনুপস্থিত। এটি বৃহত্তর শ্রেণীর অংশ ছিল যেখানে TPropertySourceসম্পত্তি যুক্ত শ্রেণি রয়েছে class ক্লাস থেকে এটিকে বের করার জন্য আপনি টিপোপার্টিসোর্সে ফাংশনটি জেনেরিক তৈরি করতে পারেন। আমি এমভিভিএম ফাউন্ডেশন থেকে সম্পূর্ণ কোডটি একবার দেখার পরামর্শ দিই ।


ফাংশনটি কীভাবে কল করা যায় তার উদাহরণ সহ এটি অবশ্যই একটি +1। ওফস, ডিবাগ দাবিতে যে আছে তা দেখেনি - এই কারণেই কোনও বিকাশকারীকে একটি লাইনের গুরুত্বপূর্ণ অংশে আনার জন্য অনুভূমিকভাবে স্ক্রোল তৈরি করা খারাপ))
ওরেগনহোস্ট

হুঁ ... এটি বুঝতে আমার এটি ছড়িয়ে দেওয়া দরকার।
জিম সি

ভিজ্যুয়াল স্টুডিও 2008 টি টিপোপ্রটিসোর্সকে ত্রুটি হিসাবে চিহ্নিত করেছে ("খুঁজে পাওয়া যায় না")।
জিম সি

আমি কেবলমাত্র এটির একটি প্রকারের নামটি বুঝতে পারলাম যে এটি কেবলমাত্র একটি চিহ্ন নয় <টি> সি ++ এর মতো। টিপ্রোপার্টিসোর্স কী উপস্থাপন করে?
জিম সি

2
এই public static string GetPropertyName<TPropertySource>(Expression<Func<TPropertySource, object>> expression)var name = GetPropertyName<TestClass>(x => x.Foo);
সংকলনটি তৈরি

16

ঠিক আছে, এখানে আমি কী তৈরি করে শেষ করেছি (আমার নির্বাচিত উত্তর এবং তিনি যে প্রশ্নটি উল্লেখ করেছেন তার উপর ভিত্তি করে):

// <summary>
// Get the name of a static or instance property from a property access lambda.
// </summary>
// <typeparam name="T">Type of the property</typeparam>
// <param name="propertyLambda">lambda expression of the form: '() => Class.Property' or '() => object.Property'</param>
// <returns>The name of the property</returns>

public string GetPropertyName<T>(Expression<Func<T>> propertyLambda)
{
    var me = propertyLambda.Body as MemberExpression;

    if (me == null)
    {
        throw new ArgumentException("You must pass a lambda of the form: '() => Class.Property' or '() => object.Property'");
    }

    return me.Member.Name;
 }

ব্যবহার:

// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);

// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);

8

PropertyInfo বর্গ আপনি এই অর্জন, যদি আমি সঠিকভাবে বুঝতে সাহায্য করা উচিত।

  1. Type.GetProperties () পদ্ধতি

    PropertyInfo[] propInfos = typeof(ReflectedType).GetProperties();
    propInfos.ToList().ForEach(p => 
        Console.WriteLine(string.Format("Property name: {0}", p.Name));

এই আপনার প্রয়োজন কি?


নাহ, যদিও অ্যাপটি "সোমসেক্রেট" এর জন্য অনুরোধটি গ্রহণ করলে আমি getProperties ব্যবহার করি। অ্যাপটি "সামারসেক্রেট" নামে পরিচিত একটি শ্রেণীর "স্যাম্পার্পার্টি" নামে একটি সম্পত্তি পাওয়া দরকার এটি আবিষ্কার করতে একটি মানচিত্রে "সামসেক্রেট" সন্ধান করে।
জিম সি

নেমফ (সাম্প্রোপার্টি) প্রকৃতপক্ষে .net 4.0 থেকে এটিকে সহজ করে দেয়। এত দীর্ঘ হ্যাকের প্রয়োজন নেই।
ডিভ তিওয়ারি

6

বৈশিষ্ট্যের প্রকৃত নামগুলি পেতে আপনি প্রতিবিম্বটি ব্যবহার করতে পারেন।

http://www.csharp-examples.net/reflection-property-names/

আপনার যদি কোনও সম্পত্তিতে "স্ট্রিং নাম" নির্ধারণের জন্য কোনও উপায়ের প্রয়োজন হয় তবে আপনি স্ট্রিংয়ের নামটি পেতে প্রতিবিম্বিত করতে পারেন এমন একটি গুণাবলী কেন লিখবেন না?

[StringName("MyStringName")]
private string MyProperty
{
    get { ... }
}

1
হ্যাঁ, অ্যাপ্লিকেশনটি "সামসেক্রেট" এর জন্য আগত অনুরোধগুলি পরিচালনা করে তবে এটি আমাকে এক্সপোজোপ্রটি সমস্যাটির কোনও সরঞ্জাম দেয় না।
জিম সি

মজাদার ... তারপরে আপনি মাইস্ট্রিংনামের সাথে জগাখিচু না হওয়া অবধি আপনার মনের বিষয়বস্তুতে মাইপ্রোপার্টিটির নামকরণ করতে পারেন এবং যদি কোনও কারণে আপনি এটি পরিবর্তন করতে চান তবে আপনাকে এক্সপোজপ্রপার্টি পার্মটি পরিবর্তন করতে হবে। কমপক্ষে আমি এ জাতীয় সতর্কতার সাথে বৈশিষ্ট্যের পাশে একটি মন্তব্য যুক্ত করতে পারি যেহেতু আপনাকে গুণকের মান পরিবর্তন করতে (এটির কোনও সম্পত্তি থেকে নাম পরিবর্তন করার পরিবর্তে, কোনও রেফারেন্সের অবস্থান থেকে করা যায়) পরিবর্তনের জন্য এটি দেখতে হবে।
জিম সি

6

আমি একাধিক বৈশিষ্ট্যের উপর চেইনে আপনার সমাধানটি পরিবর্তন করেছি:

public static string GetPropertyName<T>(Expression<Func<T>> propertyLambda)
{
    MemberExpression me = propertyLambda.Body as MemberExpression;
    if (me == null)
    {
        throw new ArgumentException("You must pass a lambda of the form: '() => Class.Property' or '() => object.Property'");
    }

    string result = string.Empty;
    do
    {
        result = me.Member.Name + "." + result;
        me = me.Expression as MemberExpression;
    } while (me != null);

    result = result.Remove(result.Length - 1); // remove the trailing "."
    return result;
}

ব্যবহার:

string name = GetPropertyName(() => someObject.SomeProperty.SomeOtherProperty);
// returns "SomeProperty.SomeOtherProperty"

4

ইতিমধ্যে প্রশ্নে এবং এই নিবন্ধটিতে উত্তরটির ভিত্তিতে: https://handcraftsman.wordpress.com/2008/11/11/how-to-get-c-property-names-without-magic-strings/ I আমি এই সমস্যার আমার সমাধান উপস্থাপন করছি:

public static class PropertyNameHelper
{
    /// <summary>
    /// A static method to get the Propertyname String of a Property
    /// It eliminates the need for "Magic Strings" and assures type safety when renaming properties.
    /// See: http://stackoverflow.com/questions/2820660/get-name-of-property-as-a-string
    /// </summary>
    /// <example>
    /// // Static Property
    /// string name = PropertyNameHelper.GetPropertyName(() => SomeClass.SomeProperty);
    /// // Instance Property
    /// string name = PropertyNameHelper.GetPropertyName(() => someObject.SomeProperty);
    /// </example>
    /// <typeparam name="T"></typeparam>
    /// <param name="propertyLambda"></param>
    /// <returns></returns>
    public static string GetPropertyName<T>(Expression<Func<T>> propertyLambda)
    {
        var me = propertyLambda.Body as MemberExpression;

        if (me == null)
        {
            throw new ArgumentException("You must pass a lambda of the form: '() => Class.Property' or '() => object.Property'");
        }

        return me.Member.Name;
    }
    /// <summary>
    /// Another way to get Instance Property names as strings.
    /// With this method you don't need to create a instance first.
    /// See the example.
    /// See: https://handcraftsman.wordpress.com/2008/11/11/how-to-get-c-property-names-without-magic-strings/
    /// </summary>
    /// <example>
    /// string name = PropertyNameHelper((Firma f) => f.Firmenumsatz_Waehrung);
    /// </example>
    /// <typeparam name="T"></typeparam>
    /// <typeparam name="TReturn"></typeparam>
    /// <param name="expression"></param>
    /// <returns></returns>
    public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>> expression)
    {
        MemberExpression body = (MemberExpression)expression.Body;
        return body.Member.Name;
    }
}

এবং একটি পরীক্ষা যা উদাহরণস্বরূপ এবং স্থিতিশীল বৈশিষ্ট্যগুলির ব্যবহারও দেখায়:

[TestClass]
public class PropertyNameHelperTest
{
    private class TestClass
    {
        public static string StaticString { get; set; }
        public string InstanceString { get; set; }
    }

    [TestMethod]
    public void TestGetPropertyName()
    {
        Assert.AreEqual("StaticString", PropertyNameHelper.GetPropertyName(() => TestClass.StaticString));

        Assert.AreEqual("InstanceString", PropertyNameHelper.GetPropertyName((TestClass t) => t.InstanceString));
    }
}

3

পুরানো প্রশ্ন, তবে এই প্রশ্নের আর একটি উত্তর হ'ল একটি সহায়ক শ্রেণিতে একটি স্ট্যাটিক ফাংশন তৈরি করা যা কলারমেমবারনেমঅ্যাট্রিবিউট ব্যবহার করে।

public static string GetPropertyName([CallerMemberName] String propertyName = null) {
  return propertyName;
}

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

public string MyProperty {
  get { Console.WriteLine("{0} was called", GetPropertyName()); return _myProperty; }
}

0

আপনি বর্তমান ফাংশনটির নাম পেতে স্ট্যাকট্রেস ক্লাসটি ব্যবহার করতে পারেন, (বা যদি আপনি কোনও ফাংশনে কোডটি রাখেন, তবে একটি স্তর থেকে সরে যান এবং কলিং ফাংশন পান)।

Http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace(VS.71).aspx দেখুন


স্ট্যাক ট্রেস ক্যাপচার করার জন্য আপনার মন কোথায় ছিল তা আমি জানি না, তবে আমি সম্পত্তির নামটি ধারণ করতে পারে এমন কোনওটির কথা ভাবতে পারি না।
জিম সি

আপনি এটি করতে পারেন, তবে এটি সংযোজক ইনলাইনিং অপ্টিমাইজেশনের কারণে অপ্রত্যাশিত ফলাফলগুলি (ব্যতিক্রমগুলি সহ) বাড়ে। স্মেলসার.না.ব্লগ / পোস্ট
২০০৮/

0

আমি এই উত্তরটি দুর্দান্ত প্রভাবটিতে ব্যবহার করছি: একটি স্ট্রিং হিসাবে সম্পত্তিটি পান, একটি এক্সপ্রেশন <ফানক <টিএমডেল, টিপ্রোপার্টি >> থেকে

আমি বুঝতে পারি আমি ইতিমধ্যে কিছুক্ষণ আগে এই প্রশ্নের উত্তর দিয়েছি। আমার অন্য উত্তরটির একমাত্র সুবিধা হ'ল এটি স্থির বৈশিষ্ট্যের জন্য কাজ করে। আমি এই উত্তরে বাক্য গঠনটি আরও দরকারী বলে মনে করি কারণ আপনি যে ধরণের প্রতিফলন করতে চান তার বৈকল্পিক তৈরি করতে হবে না।


0

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

কোডটি আমি শেষ করে দিয়েছি:

public class HideableControl<T>: Control where T: class
{
    private string _propertyName;
    private PropertyInfo _propertyInfo;

    public string PropertyName
    {
        get { return _propertyName; }
        set
        {
            _propertyName = value;
            _propertyInfo = typeof(T).GetProperty(value);
        }
    }

    protected override bool GetIsVisible(IRenderContext context)
    {
        if (_propertyInfo == null)
            return false;

        var model = context.Get<T>();

        if (model == null)
            return false;

        return (bool)_propertyInfo.GetValue(model, null);
    }

    protected void SetIsVisibleProperty(Expression<Func<T, bool>> propertyLambda)
    {
        var expression = propertyLambda.Body as MemberExpression;
        if (expression == null)
            throw new ArgumentException("You must pass a lambda of the form: 'vm => vm.Property'");

        PropertyName = expression.Member.Name;
    }
}

public interface ICompanyViewModel
{
    string CompanyName { get; }
    bool IsVisible { get; }
}

public class CompanyControl: HideableControl<ICompanyViewModel>
{
    public CompanyControl()
    {
        SetIsVisibleProperty(vm => vm.IsVisible);
    }
}

আমার জন্য গুরুত্বপূর্ণ অংশটি CompanyControlক্লাসে এই সংকলকটি কেবল আমাকে একটি বুলিয়ান সম্পত্তি বেছে নেওয়ার অনুমতি দেবে ICompanyViewModelযার মধ্যে অন্যান্য বিকাশকারীদের এটি সঠিক হওয়া সহজ করে তোলে।

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


0

এটি আমি কীভাবে এটি প্রয়োগ করেছি, এর পেছনের কারণটি হল যদি আপনি যে শ্রেণীর সদস্য হতে নামটি পেতে চান সেটি স্থিতিশীল না হয় তবে আপনাকে সেটির একটি ইনস্ট্যান্স তৈরি করতে হবে এবং তারপরে সদস্যটির নাম পাওয়া উচিত। এখানে জেনেরিক সাহায্য করতে আসে

public static string GetName<TClass>(Expression<Func<TClass, object>> exp)
{
    MemberExpression body = exp.Body as MemberExpression;

    if (body == null)
    {
         UnaryExpression ubody = (UnaryExpression)exp.Body;
         body = ubody.Operand as MemberExpression;
    }

     return body.Member.Name;
}

ব্যবহার এই মত

var label = ClassExtension.GetName<SomeClass>(x => x.Label); //x is refering to 'SomeClass'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.