는이 코드를 가지고 :NewExpression에 대한 참조를 어떻게 보관합니까?
긴 이야기의 짧은<T>
에 데이터베이스 행의 속성을 결합
public static Func<IDataReader, T> CreateBinder<T>() {
NewExpression dataTransferObject = Expression.New(typeof(T).GetConstructor(Type.EmptyTypes));
ParameterExpression dataReader = Expression.Parameter(typeof(IDataReader), "reader");
IEnumerable<Expression> columnAssignments = typeof(T).GetProperties().Select(property => {
MethodCallExpression columnData = Expression.Call(dataReader, dataReaderIndexer, new[] { Expression.Constant(property.Name) });
MethodCallExpression setter = Expression.Call(dataTransferObject, property.SetMethod, new[] { Expression.Convert(columnData, property.PropertyType) });
return setter;
});
columnAssignments = columnAssignments.Concat(new Expression[] { dataTransferObject });
BlockExpression assignmentBlock = Expression.Block(columnAssignments);
Func<IDataReader, T> binder = Expression.Lambda<Func<IDataReader, T>>(assignmentBlock, new[] { dataReader }).Compile();
return binder;
}
. 문제는 내가 사용하고자 할 때/dataTransferObject
을 반환 할 때마다 매번 새로운 복사본을 인스턴스화한다는 것입니다. 객체를 다시 만들지 않고 참조를 얻는 방법은 무엇입니까?
을 주어진 타입'T'에 대한'binder '? –
'dataTransferObject'는'NewExpression'이므로, 사용할 때마다 같은 인스턴스를 재사용하는 것이 아니라 새로운 인스턴스를 생성합니다. 마찬가지로, 내가 setter 메소드를 호출 할 때, 이전에 인스턴스화 된 객체를 재사용하는 것이 아니라'new T(). Property '를 수행하고있다. – sircodesalot