何よりも、私はAutoMapperについて知っていますが、使用したくありません。私はC#を学んでいて、その詳細を知りたいからです。だから私はこの問題(以下で説明)を自分でやろうとしています。
ただし、プロパティの名前とタイプが同じで、ソースから読み取り可能で、ターゲットで書き込み可能な場合、あるタイプのプロパティの値を別のタイプのプロパティに対処するプロパティコピーを作成しようとしています。type.GetProperties()
メソッドを使用しています。サンプリングされたメソッドは次のとおりです。
static void Transfer(object source, object target) {
var sourceType = source.GetType();
var targetType = target.GetType();
var sourceProps = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
var targetProps = (from t in targetType.GetProperties()
where t.CanWrite
&& (t.GetSetMethod().Attributes & MethodAttributes.Static) == 0
select t).ToList();
foreach(var prop in sourceProps) {
var value = prop.GetValue(source, null);
var tProp = targetProps
.FirstOrDefault(p => p.Name == prop.Name &&
p.PropertyType.IsAssignableFrom(prop.PropertyType));
if(tProp != null)
tProp.SetValue(target, value, null);
}
}
それはうまくいきますが、私は SO で答えを読みましSystem.Reflection.Emit
た。しかし、それ以上の説明やリンクはありませんでした。このコードを高速化する方法を理解するのを手伝ってくれませんか? または、 、、およびレイト バインド デリゲートに関するリンクをいくつか提案していただけますか? または、私が対象とするのに役立つと思うものはありますか?ILGenerator
Emit
ILGenerator
完全な質問:
@svickの回答から多くのことを理解し、学びました。しかし、これをオープン ジェネリック メソッドとして使用したい場合は、どうすればよいでしょうか。このようなもの:
public TTarget Transfer<TSource, TTarget>(TSource source) where TTarget : class, new() { }
または拡張子:
public static TTarget Transfer<TSource, TTarget>(this TSource source) where TTarget : class, new() { }