//ModelFor(person =>person.Name);
public void ModelFor<TModel, TValue>(
Expression<Func<TModel, TValue>> expression)
{
//Result should be "Name"
string nameOfTValue = ????;
}
Trả lời
EDIT: Sau khi chỉnh sửa, tôi nghĩ bạn muốn tên của thành viên tham gia biểu thức, giả sử tất nhiên biểu thức là biểu thức thành viên ngay từ đầu.
((MemberExpression)expression.Body).Member.Name
Để trở thành mạnh mẽ hơn, bạn có thể làm:
var memberEx = expression.Body as MemberExpression;
if (memberEx == null)
throw new ArgumentException("Body not a member-expression.");
string name = memberEx.Member.Name;
(Không liên quan nữa):
Để có được một System.Type
đại diện cho loại kiểu TValue
-giá trị, bạn có thể sử dụng toán tử typeof
.
Bạn có thể muốn:
typeof(TValue).Name
Nhưng cũng xem xét các FullName
và AssemblyQualifiedName
tính nếu cần thiết.
Điều này thực sự không liên quan gì tới các cây biểu thức; bạn có thể sử dụng kỹ thuật này để nhận loại đối số loại cho phương thức chung bất kỳ.
Wow, chúng tôi đã viết hoàn toàn câu trả lời giống hệt nhau – CodesInChaos
Tôi không nghĩ rằng điều này là đúng, tôi nghĩ rằng anh ta muốn tên của tham số trong biểu thức loại TValue. – casperOne
@casperOne: Bạn có thể đúng; Tôi không chắc. Chúng ta hãy chờ để làm rõ. – Ani
@Ani: Tôi không nghĩ rằng đây là đúng, tôi nghĩ rằng ông muốn tên của tham số trong sự biểu hiện của kiểu TValue
Nếu điều này là đúng ... làm việc này 1 cấp sâu chỉ nhưng có thể có ích anyway:
var nameOfTValue = ((MemberExpression)expression.Body).Member.Name;
đây là thực hiện thông minh hơn mà sẽ có thể đối phó với nhiều cấp độ:
public class PropertyName{
public static string For<T>(
Expression<Func<T,object>> expression){
var body=expression.Body;
return GetMemberName(body);
}
public static string For(
Expression<Func<object>> expression){
var body=expression.Body;
return GetMemberName(body);
}
public static string GetMemberName(
Expression expression){
if(expression is MemberExpression){
var memberExpression=(MemberExpression)expression;
if(memberExpression.Expression.NodeType==
ExpressionType.MemberAccess)
return GetMemberName(memberExpression.Expression)
+"."+memberExpression.Member.Name;
return memberExpression.Member.Name;
}
if(expression is UnaryExpression){
var unaryExpression=(UnaryExpression)expression;
if(unaryExpression.NodeType!=ExpressionType.Convert)
throw new Exception(string.Format
("Cannot interpret member from {0}",expression));
return GetMemberName(unaryExpression.Operand);
}
throw new Exception
(string.Format("Could not determine member from {0}",expression));
}
}
Cách sử dụng:
var fieldName=PropertyName.For<Customer>(x=>x.Address.Region);
//fieldName==Address.Region
Một thủ thuật khác, điều này có thể được kết hợp với suy nghĩ độc đáo:
public static T Set<T,TProp>(this T o,
Expression<Func<T,TProp>> field,TProp value){
var fn=((MemberExpression)field.Body).Member.Name;
o.GetType().GetProperty(fn).SetValue(o,value,null);
return o;
}
Cho phép tính một cách dễ dàng trực tiếp thiết lập, có thể hữu ích cho đồ đạc kiểm tra:
var customer=new Customer("firstName","lastName");
customer.Set(x=>x.Name, "different firstName");
Ver đẹp, tôi thực sự thích nó! – Raffaeu
- 1. Tại sao từ điển <TKey, TValue> không có một trình duyệt <KeyValuePair <TKey, TValue >>?
- 2. C# Làm thế nào để chuyển đổi một biểu thức <Func <SomeType>> thành biểu thức <Func <OtherType>>
- 3. Rhino Mocks: Tôi có thể sử dụng Stub() khi một trong các tham số của tôi là Biểu thức <Func<T1, T2>>?
- 4. Biểu thức <Func <TModel, TProperty >> làm thuộc tính để khởi tạo đối tượng?
- 5. Làm thế nào để chuyển đổi IQueryable <T> thành Biểu thức <Func <T, bool>>?
- 6. Phương thức mở rộng Từ điển <TKey,TValue> .Xóa tất cả? Có thể không?
- 7. Quá trình băm làm việc như thế nào trong Từ điển <TKey, TValue>
- 8. SortedList <>, SortedDictionary <> và Dictionary <>
- 9. động Func <IQueryable <TEntity>, IOrderedQueryable <TEntity>> Biểu hiện
- 10. Cách chuyển đổi Expr <'a -> 'b> thành Biểu thức <Func <'a, obj>>
- 11. Trả về biểu thức chung chung lồng nhau <Func <T, bool>>
- 12. Làm thế nào để đúc Expression <Func <T, DateTime>> để Expression <Func <T, object>>
- 13. Làm cách nào để tôi có thể thực hiện một hoạt động Func <object [], Expression <Func<T,bool> >>?
- 14. Cách chuyển đổi LambdaExpression thành Biểu thức được nhập <Func<T, T>>
- 15. Cách tạo Biểu thức <Func <động, động >> - Hay là một lỗi?
- 16. Tại sao không có ObservableKeyedCollection <TKey, TValue> trong .NET Framework?
- 17. Tại sao Func <> và Expression <Func<>> Hoán đổi cho nhau? Tại sao một người làm việc trong trường hợp của tôi?
- 18. Có từ điển <TKey, TValue> theo thứ tự các khóa theo mặc định không?
- 19. An toàn chủ đề của từ điển <TKey, TValue>
- 20. Nên ConditionalWeakTable <TKey, TValue> được sử dụng cho các mục đích không biên dịch?
- 21. Trong F # làm thế nào tôi có thể tạo ra một biểu thức với một loại Func <obj>?
- 22. .NET4.0: Chủ đề An toàn cập nhật của ConcurrentDictionary <TKey, TValue>
- 23. LINQ-to-SQL: Chuyển đổi Func <T, T, bool> thành Biểu thức <Func <T, T, bool>>
- 24. Task.Run và Func <>
- 25. Chuyển đổi biểu thức <Func <T, T2, bool>> thành biểu thức <Func <T2, bool>> bằng cách giới thiệu hằng số cho T
- 26. C# Action <> với Func <> tham số
- 27. Expression <Func <T, bool>> từ F # func
- 28. Nhận loại trả về thực tế từ Biểu thức <Func <T, object>> ví dụ
- 29. Tôi có thể có Hành động <> hoặc Func <> với tham số ngoài không?
- 30. Hợp nhất từ điển <TKey, TValue> với Enumerable.Phương pháp UnUnited
Bạn cần làm rõ, bạn có muốn tên loại TValue hay bạn muốn tên của p tham số trong biểu thức? – casperOne
@casperOne - Tôi đã chỉnh sửa – Freshblood
@casperOne 'TValue' luôn là kiểu trả về và không phải là thông số bình thường. – CodesInChaos