ラムダ式のパラメーターの型をある型から別の型に置き換えようとしています。
私はstackoverflowで他の答え、つまりこれを見つけましたが、私はそれらに運がありませんでした。
ドメイン オブジェクトと、ドメイン オブジェクトを取得できるリポジトリがあると想像してみてください。
ただし、リポジトリは独自のデータ転送オブジェクトを処理し、ドメイン オブジェクトをマップして返す必要があります。
ColourDto.cs
public class DtoColour {
public DtoColour(string name)
{
Name = name;
}
public string Name { get; set; }
}
DomainColour.cs
public class DomainColour {
public DomainColour(string name)
{
Name = name;
}
public string Name { get; set; }
}
リポジトリ.cs
public class ColourRepository {
...
public IEnumerable<DomainColour> GetWhere(Expression<Func<DomainColour, bool>> predicate)
{
// Context.Colours is of type ColourDto
return Context.Colours.Where(predicate).Map().ToList();
}
}
ご覧のとおり、述語はドメイン モデル用であり、リポジトリ内のコレクションはデータ転送オブジェクトのコレクションであるため、これは機能しません。
これを行うために を使用しようとしましたが、たとえば、例外がスローされずにExpressionVisitor
のタイプを変更する方法がわかりません。ParameterExpression
テストシナリオ
public class ColourRepository {
...
public IEnumerable<DomainColour> GetWhere(Expression<Func<DomainColour, bool>> predicate)
{
var visitor = new MyExpressionVisitor();
var newPredicate = visitor.Visit(predicate) as Expression<Func<ColourDto, bool>>;
return Context.Colours.Where(newPredicate.Complie()).Map().ToList();
}
}
public class MyExpressionVisitor : ExpressionVisitor
{
protected override Expression VisitParameter(ParameterExpression node)
{
return Expression.Parameter(typeof(ColourDto), node.Name);
}
}
最後に、例外は次のとおりです。
System.ArgumentException : プロパティ 'System.String Name' は型 'ColourDto' に対して定義されていません
誰かが助けてくれることを願っています。
編集:ここにdotnetfiddleがあります
まだ動作しません。
編集:ここに作業中のdotnetfiddleがあります
ありがとうエリ・アーベル