in src/OpenTelemetryEngine/Traces/ActivityExtensions.cs [71:91]
internal static Action<TTarget, TValue> CreateSetter<TTarget, TValue>(this FieldInfo fieldInfo)
{
if (fieldInfo == null)
{
throw new ArgumentNullException(nameof(fieldInfo));
}
ParameterExpression targetExp = Expression.Parameter(typeof(TTarget), "target");
Expression source = targetExp;
if (typeof(TTarget) != fieldInfo.DeclaringType && fieldInfo.DeclaringType is not null)
{
source = Expression.Convert(targetExp, fieldInfo.DeclaringType);
}
// Creating the setter to set the value to the field
ParameterExpression valueExp = Expression.Parameter(typeof(TValue), "value");
MemberExpression fieldExp = Expression.Field(source, fieldInfo);
BinaryExpression assignExp = Expression.Assign(fieldExp, valueExp);
return Expression.Lambda<Action<TTarget, TValue>>(assignExp, targetExp, valueExp).Compile();
}