주면서 많은 시나리오를 위해 중대하다 -하지만 당신이 그들을 원하지 않는 경우, 아마도 단순히를 사용하지 않는? 나는 그것을 말하고 싶지 않지만 간단한 문자열은 데이터 바인딩과 같은 시나리오에서 특히 시험되고 테스트됩니다. 빠른 액세스를 원하면 HyperDescriptor를 보거나 속성 접근 자의 대리인을 컴파일하는 방법이 있거나 문자열에서 Expression
을 빌드하고 컴파일 할 수 있습니다 (알려진 서명을 원할 경우 object
으로 캐스트 포함) (훨씬 느린) DynamicInvoke
을 호출하는 것이 아니라).
물론 대부분의 경우 조잡한 반사조차도 충분히 빠르며 병목 현상이 아닙니다.
가장 간단한 코드로 시작하는 것이 좋습니다. 실제로는 입니다. 실제로는이 너무 빠르다고 걱정하기 전에 느립니다. 너무 느리지 않으면 변경하지 마십시오. 위 옵션 중 어느 것이 든 다르게 작동합니다.
또 다른 생각; 당신이 Expression
를 사용하는 경우, 당신은 같은 것을 할 수있는 :
public void IncludeProperties<T>(
Expression<Func<T,object>> selectedProperties)
{
// some logic to store parameter
}
IncludeProperties<IUser>(u => new { u.ID, u.LogOnName, u.HashedPassword });
을 한 후 분리 식을? 개별 액세스를 위해 자신의 람다를 구축하는 것은 사소한해야한다는 MemberInfo
의 (위의 me.Member
)를 알게되면
public static void IncludeProperties<T>(
Expression<Func<T, object>> selectedProperties)
{
NewExpression ne = selectedProperties.Body as NewExpression;
if (ne == null) throw new InvalidOperationException(
"Object constructor expected");
foreach (Expression arg in ne.Arguments)
{
MemberExpression me = arg as MemberExpression;
if (me == null || me.Expression != selectedProperties.Parameters[0])
throw new InvalidOperationException(
"Object constructor argument should be a direct member");
Console.WriteLine("Accessing: " + me.Member.Name);
}
}
static void Main()
{
IncludeProperties<IUser>(u => new { u.ID, u.LogOnName, u.HashedPassword });
}
: 조금 정돈, 적어도 ... 여기 해체를 보여주는 몇 가지 예제 코드입니다. 예를 들어 (object
에 캐스트를 포함하는 하나의 서명을 얻을) :
이
var param = Expression.Parameter(typeof(T), "x");
var memberAccess = Expression.MakeMemberAccess(param, me.Member);
var body = Expression.Convert(memberAccess, typeof(object));
var lambda = Expression.Lambda<Func<T, object>>(body, param);
var func = lambda.Compile();
우, 좋은 일 :) –
무엇에 가장 좋은 방법 빠른 액세스를 위해 선택한 속성을 유지 하시겠습니까?을 나열 하시겠습니까? –
'MemberInfo'는 괜찮을 것입니다; 'Func'(또는'Func