5
public class ConflictSaver
{
    private readonly IEnumerable<CommonJobDataInfo> _conflictingJobData;
    private readonly DataAccessDataContext _dc;

    public ConflictSaver(IEnumerable<CommonJobDataInfo> conflictingJobData, DataAccessDataContext dc)
    {
        _conflictingJobData = conflictingJobData;
        _dc = dc;
    }

    public void Save()
    {
        foreach (var data in _conflictingJobData)
        {
            var type = data.ClientBaseObject.GetType();
            var formattedProperty = data.Property.Trim('.').ToUpper();
            foreach (var property in type.GetProperties())
            {
                var currentProperty = data.ClientBaseObject.GetType().GetProperties().First(t => t.Name.Trim() == property.Name.Trim());

                if(currentProperty.Name.ToUpper()== formattedProperty)
                {
                    if (data.UseServerValue)
                        currentProperty.SetValue(currentProperty, data.ServerValue, null);
                    else
                        currentProperty.SetValue(currentProperty, data.ClientValue, null);
                }
            }

        }
    }
}  

SetValue()を呼び出そうとすると、Save()関数でオブジェクトがターゲットタイプと一致しません。私は反射に悪臭を放ちます。

4

1 に答える 1

3

間違ったオーバーロードを使用し、間違ったオブジェクトを渡しているようです:

if (data.UseServerValue)
    currentProperty.SetValue(data.ClientBaseObject, data.ServerValue);
else
    currentProperty.SetValue(data.ClientBaseObject, data.ClientValue);

プロパティは に属してdata.ClientBaseObjectいるため、呼び出し対象にする必要があります。そのプロパティには idexer がないため、.NET 4.5 以降を使用している場合は、3 番目のパラメーターをすべてスキップできます。

于 2013-03-05T19:50:36.800 に答える