我的属性绑定数据访问类有一个小问题(更像是一个烦恼)。问题是当读取器中不存在类中相应属性的列时,映射会失败。
这是映射器类:
// Map our datareader object to a strongly typed list
private static IList<T> Map<T>(DbDataReader dr) where T : new()
{
try
{
// initialize our returnable list
List<T> list = new List<T>();
// fire up the lamda mapping
var converter = new Converter<T>();
while (dr.Read())
{
// read in each row, and properly map it to our T object
var obj = converter.CreateItemFromRow(dr);
// add it to our list
list.Add(obj);
}
// reutrn it
return list;
} …Run Code Online (Sandbox Code Playgroud) c# reflection expression-trees dbdatareader linq-expressions
我正在处理一个 MVC 项目,并希望将一个属性的名称传递给 Html.TextboxFor 方法。这是我的视图模型
public class RuleViewModel<T> where T : class, IValidatableObject
{
private T _rule;
public T RuleModel
{
get
{
return _rule
?? (_rule = Activator.CreateInstance<T>());
}
}
public RuleMetadata Metadata { get; set; }
public Expression<Func<RuleViewModel<T>, Object>> GetParameterByName(PropertyInfo pi)
{
var fieldName = Expression.Parameter(typeof(RuleViewModel<T>), "x");
var fieldExpression = Expression.PropertyOrField(Expression.Property(fieldName, "RuleModel"), pi.Name);
var exp = Expression.Lambda<Func<RuleViewModel<T>, Object>>(fieldExpression, fieldName);
return exp;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在视图中我这样做
@foreach (var prop in Model.RuleModel.GetType().GetProperties())
{
var result = Model.Metadata.Columns.SingleOrDefault(m => m.ColumnName == prop.Name); …Run Code Online (Sandbox Code Playgroud) 我有两个班级:
public class DalMembershipUser
{
public string UserName { get; set; }
//other members
}
public class MembershipUser
{
public string UserName { get; set; }
//other members
}
Run Code Online (Sandbox Code Playgroud)
我有功能:
public IEnumerable<DalMembershipUser> GetMany(Expression<Func<DalMembershipUser, bool>> predicate)
{
//but here i can use only Func<MembershipUser, bool>
//so i made transformation
query = query.Where(ExpressionTransformer<DalMembershipUser,MembershipUser>.Tranform(predicate));
}
Run Code Online (Sandbox Code Playgroud)
当前实现:
public static class ExpressionTransformer<TFrom, TTo>
{
public class Visitor : ExpressionVisitor
{
private ParameterExpression _targetParameterExpression;
public Visitor(ParameterExpression parameter)
{
_targetParameterExpression = parameter;
}
protected override Expression VisitParameter(ParameterExpression …Run Code Online (Sandbox Code Playgroud) 假设我有一个Expression<Func<T,object>>是否可以根据Type变量动态地将返回类型更改为类似Expression<Func<T,int>>
我有以下课程:
public class ImportCheck<T> {
public int id { get; set; }
public string Name { get; set; }
public Type Type { get; set; }
public bool Required { get; set; }
public int? MinLength { get; set; }
public int? MaxLength { get; set; }
public string Value { get; set; }
public Expression<Func<T, object>> AssociatedProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有一个List<ImportCheck<Contact>>循环遍历并为每个Contact对象设置一个属性(属性都是不同的类型)。为了使我能够设置嵌套对象的属性,我需要结果类型与目标类型相同。如果说联系人的所有属性,int那么我现在所拥有的就可以正常工作,这是因为我有一个不同类型的列表,这让我很头疼。
这是我设置子属性的方式:
private static Action<M, …Run Code Online (Sandbox Code Playgroud) 浏览 System.Linq.Expressions 的 .NET 核心源代码,我发现以下代码位于此处:
MethodInfo mi = property.GetGetMethod(true);
if (mi == null)
{
mi = property.GetSetMethod(true);
if (mi == null)
{
throw Error.PropertyDoesNotHaveAccessor(property, nameof(property));
}
}
Run Code Online (Sandbox Code Playgroud)
有没有什么办法GetGetMethod 和 GetSetMethod既可以返回null,因为似乎占了这里?这是死代码吗?C# 编译器不允许属性没有 getter 和 setter,所以这对PropertyInfo.
我的动机是通过添加测试覆盖率来为 OSS 代码做出贡献,所以我想看看哪些测试用例会覆盖这个
如何创建一个Expression地点
Expression.NodeType == ExpresionType.IsTrue || ExpresionType.IsFalse
Run Code Online (Sandbox Code Playgroud)
我正在创建 EnumerableQuery 的自定义版本,在其中重写所有表达式以处理 Null 检查。因此,当将 EF Linq2Sql 代码作为 Linq2Objects 进行单元测试时,访问的null导航属性不会引发异常,而是优雅地处理它。
我正在尝试对所有成员进行测试ExpressionType。如何创建表达式语法来创建ExpressionType.IsTrue和ExpressionType.IsFalse节点。
Where条款:
queryable.Where(x => x.L1.L2.L3.L4.L5.Boolean);
Run Code Online (Sandbox Code Playgroud)
回报
ExpressionType.MemberAccess
Run Code Online (Sandbox Code Playgroud)
以下Where条款:
queryable.Where(x => !(x.L1.L2.L3.L4.L5.Boolean && x.L1.L2.L3.L4.L5.Boolean));
Run Code Online (Sandbox Code Playgroud)
回报
ExpressionType.Not
ExpressionType.AndAlso
Left = ExpressionType.MemberAccess
Right = ExpressionType.MemberAccess
Run Code Online (Sandbox Code Playgroud)
Where条款
queryable.Where(x => true);
Run Code Online (Sandbox Code Playgroud)
回报
ExpressionType.Constant
Run Code Online (Sandbox Code Playgroud)
我猜测这些ExpressionType …
我正在尝试构建一个表达式,用于创建Tuple<>具有可变数量泛型类型参数的泛型实例。
生成实例的想法Tuple<>是根据具有 a 的属性为实体类型动态创建复合键值KeyAttribute。然后,复合键将用作Dictionary<object, TEntity>. 因此,应该为特定实体类型构建 lambda 表达式,并调用 lambda,传递 的实例TEntity以获取 a 形式的组合键Tuple<>。
实体模型示例
public class MyEntityModel
{
[Key]
public string Key1 { get; set; }
[Key]
public Guid Key2 { get; set; }
public int OtherProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
应该做什么表情
public Func<MyEntityModel, object> BuildKeyFactory()
{
// This is how the LambdaExpression should look like, but then for a generic entity type instead of fixed to MyEntityModel …Run Code Online (Sandbox Code Playgroud) 假设我们有 2 个班级
class A{
public abstract int Prop1 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
这是孩子
class Child : A{
[CustomAttr(someval)]
override public int Prop1 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
所以稍后在我的代码中我需要获取此自定义属性的 val。
bool haveCustomAttr(IExpression<Func<Child, int>> property){
return ((MemberExpression)property.Body).Member.GetCustomAttributes(typeof(CustomAttr)).Any();
}
Run Code Online (Sandbox Code Playgroud)
所以当我调用这段代码时
haveCustomAttr(c => c.Prop1)
Run Code Online (Sandbox Code Playgroud)
它的返回是false因为((MemberExpression)property.Body).Member它是出于某种原因A.Prop1而不是Child.Prop1
可以用这样更先进的结构来修复
((MemberExpression)property.Body).Expression.Type.GetMember(((MemberExpression)property.Body).Member
.Name)[0].GetCustomAttributes(typeof(CustomAttr), false).Any();
Run Code Online (Sandbox Code Playgroud)
但我仍然不清楚为什么它最初会威胁这个表达式作为基类,如果它明确地说它是来自Child类的表达式。有人能为我解释一下这背后的逻辑吗?
我正在尝试构建 Odata 表达式的解析器,当字段可为空时,我收到错误。
public class UserRight
{
public bool? active
}
public void Test(){
Expression<Func<UserRight, bool>> expression = p => p.Active == true;
}
Run Code Online (Sandbox Code Playgroud)
它生成了以下表达式:
{p => (p.Active == Convert(True, Nullable`1))}
Run Code Online (Sandbox Code Playgroud)
但我想收到它
{p => (p.Active == True)}
Run Code Online (Sandbox Code Playgroud)
为了避免这种“转换”。有没有简单的方法可以做到这一点?因为我的解析器已经准备好了,我不想仅仅因为一个可为空的字段而重建它。
我有这个方法和参数。
void SomeMethod(Expression<Func<Products, bool>> where)
Run Code Online (Sandbox Code Playgroud)
我这样称呼这个方法;
int i = 9;
SomeMethod(x=>x.Id==i)
Run Code Online (Sandbox Code Playgroud)
我希望它产生这个字符串;
"x=>x.Id==9"
Run Code Online (Sandbox Code Playgroud)
如果我只是按原样打印出上面的表达式,它会给我这个字符串:
"x => (x.Id == value(isTakibi.WepApp.Controllers.HomeController+<>c__DisplayClass4_0).i)"
Run Code Online (Sandbox Code Playgroud)
但我需要“x.Id == 9”。我需要评估变量的值,i以便结果为“x.id==9”。
c# ×10
linq-expressions ×10
.net ×3
reflection ×3
expression ×2
asp.net-mvc ×1
attributes ×1
compilation ×1
dbdatareader ×1
linq ×1
propertyinfo ×1