[英]How to declare a method that returns a generic collection of “anything” (C#)
[英]C# Generic Method: how to declare this kind?
我希望能夠像這樣調用這個方法:
test.TestMethod<From, To>(to => to.Prop1);
並具有來自 To 的 IDE 自動完成屬性。 在TestMethod
,我想提取屬性的名稱。 在這種情況下Prop1
。 這似乎是一種工作,但我不確定Expression<Func<TTo, object>>
,尤其是對象部分。
public class Test
{
public void TestMethod<TFrom, TTo>(Expression<Func<TTo, object>> p)
{
}
}
如果我通過 p 遞歸,它現在會做它應該做的事情,我可以得到這個名字,但對我來說它看起來不正確,特別是因為拉取道具的名字看起來像:
((MemberExpression)((UnaryExpression)(((LambdaExpression)p).Body)).Operand)).Member.Name
有什么辦法可以做這個清潔工嗎?
這是一個幫助類,它將檢查表達式並提取屬性的成員信息
using System.Linq.Expressions;
using System.Reflection;
/// <summary>
/// Extension for <see cref="Expression"/>.
/// </summary>
public static class ExpressionExtensions {
/// <summary>
/// Converts an expression into a <see cref="System.Reflection.MemberInfo"/>.
/// </summary>
/// <param name="expression">The expression to convert.</param>
/// <returns>The member info.</returns>
public static MemberInfo GetMemberInfo(this Expression expression) {
var lambda = (LambdaExpression)expression;
MemberExpression memberExpression;
if (lambda.Body is UnaryExpression) {
var unaryExpression = (UnaryExpression)lambda.Body;
memberExpression = (MemberExpression)unaryExpression.Operand;
}
else
memberExpression = (MemberExpression)lambda.Body;
return memberExpression.Member;
}
}
有了它,您就可以按預期提取名稱...
public class Test {
public void TestMethod<TFrom, TTo>(Expression<Func<TTo>> property) {
var memberName = property.GetMemberInfo().Name;
//...other code
}
}
然后你就可以像這樣調用這個方法......
test.TestMethod<From, To>(to => to.Prop1);
...並獲取屬性名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.