الحصول على اسم خاصية بتمريرها إلى وسيلة
-
08-07-2019 - |
سؤال
وستاكوفيرفلوو jolson المستخدم قطعة جميلة جدا من التعليمات البرمجية التي تجسد كيف يمكن للمرء أن تسجيل menthods دون استخدام السلاسل، ولكن أشجار التعبير <لأ href = "https://stackoverflow.com/questions/9033/hidden-features-of- ج # 52998 "> هنا .
هل من الممكن أن يكون شيئا من هذا القبيل على العقارات بدلا من الأساليب؟ لتمرير خاصية (وليس اسم العقار) وداخل طريقة للحصول على اسم العقار؟
وشيء من هذا القبيل:
RegisterMethod(p => p.Name)
void RegisterMethod(Expression??? propertyExpression) where T : Property ???
{
string propName = propertyExpression.Name;
}
وشكرا.
المحلول
ويمكنك كتابة شيء على ما يلي:
static void RegisterMethod<TSelf, TProp> (Expression<Func<TSelf, TProp>> expression)
{
var member_expression = expression.Body as MemberExpression;
if (member_expression == null)
return;
var member = member_expression.Member;
if (member.MemberType != MemberTypes.Property)
return;
var property = member as PropertyInfo;
var name = property.Name;
// ...
}
نصائح أخرى
ونشرت لي مثالا الكامل لهذا <وأ href = "http://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/f44dc57a9dc5168d/02c312dcf8a9a769#4805324df6b30218" يختلط = " noreferrer "> هنا (انظر أيضا منصب حول" this
"تحته)
ملاحظة أنه يتعامل مع LambdaExpression
وما إلى ذلك استكمالا لالكود كما نشر، يمكنك إضافة أكثر قليلا لجعله أسهل للاستخدام في بعض الحالات:
static class MemberUtil<TType>
{
public static string MemberName<TResult>(Expression<Func<TType, TResult>> member)
{
return MemberUtil.MemberName<TType, TResult>(member);
}
}
وبعد ذلك يمكنك استخدام عام نوع الاستدلال لقيمة الإرجاع:
string test1 = MemberUtil<Foo>.MemberName(x => x.Bar);
string test2 = MemberUtil<Foo>.MemberName(x => x.Bloop());