
特にMVCなどを使っていると、各オブジェクトのプロパティを連携するオブジェクトのプロパティに詰め替える必要が多く出てきます。
オブジェクトごとに専用の詰め替えメソッドを用意してもよいのですが、そのメソッドの作成にかけるためをなるべく小さくしないと、詰め替え処理を作るだけで時間を浪費してしまします。
この処理を簡単にするための方法を調査したので、まとめておきます。
[C#のプロパティコピークラスサンプル】
public static class PropertyCopier
{
public static T CopyTo(object src, T dest)
{
if (src == null || dest == null) return dest;
// コピー元のPublicなインスタンス属性(読み書き可能)を抽出
var srcProperties = src.GetType().GetProperties(
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance
).Where(p => p.CanRead && p.CanWrite);
// コピー先のPublicなインスタンス属性(読み書き可能)を抽出
var destProperties = dest.GetType().GetProperties(
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
.Where(p => p.CanRead && p.CanWrite);
// LINQのJOINを使用して属性名とタイプが一致するもので、コピー元の属性をキーとしたプロパティを作成
var properties = srcProperties.Join(
destProperties,
p => new { p.Name,p.PropertyType},
p => new { p.Name, p.PropertyType },
(p1, p2) => new { p1, p2 });
// 作成プロパティを使用してコピー先の属性値にコピー元の属性値をコピー
foreach (var property in properties)
property.p2.SetValue(dest, property.p1.GetValue(src));
return dest;
}
}
なお、本内容の確認にあたっては、rksoftwareの記事「異なる型のオブジェクトに同じ名前のプロパティの値を全てセットする」を引用させていただきました。
C#の場合はこの形が多いと思いますが、Javaの場合は、BeanUtils#copyProperties()が用意されているようです。使い方は婿入りエンジニアさんの記事「[Java最強関数] BeanUtils.copyPropertiesのすゝめ」まとめられていました。
【C#】【Java】
オブジェクトごとに専用の詰め替えメソッドを用意してもよいのですが、そのメソッドの作成にかけるためをなるべく小さくしないと、詰め替え処理を作るだけで時間を浪費してしまします。
この処理を簡単にするための方法を調査したので、まとめておきます。
[C#のプロパティコピークラスサンプル】
public static class PropertyCopier
{
public static T CopyTo
{
if (src == null || dest == null) return dest;
// コピー元のPublicなインスタンス属性(読み書き可能)を抽出
var srcProperties = src.GetType().GetProperties(
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance
).Where(p => p.CanRead && p.CanWrite);
// コピー先のPublicなインスタンス属性(読み書き可能)を抽出
var destProperties = dest.GetType().GetProperties(
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
.Where(p => p.CanRead && p.CanWrite);
// LINQのJOINを使用して属性名とタイプが一致するもので、コピー元の属性をキーとしたプロパティを作成
var properties = srcProperties.Join(
destProperties,
p => new { p.Name,p.PropertyType},
p => new { p.Name, p.PropertyType },
(p1, p2) => new { p1, p2 });
// 作成プロパティを使用してコピー先の属性値にコピー元の属性値をコピー
foreach (var property in properties)
property.p2.SetValue(dest, property.p1.GetValue(src));
return dest;
}
}
なお、本内容の確認にあたっては、rksoftwareの記事「異なる型のオブジェクトに同じ名前のプロパティの値を全てセットする」を引用させていただきました。
C#の場合はこの形が多いと思いますが、Javaの場合は、BeanUtils#copyProperties()が用意されているようです。使い方は婿入りエンジニアさんの記事「[Java最強関数] BeanUtils.copyPropertiesのすゝめ」まとめられていました。
【C#】【Java】

| ホーム |