2013-03-05 28 views
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); 
       } 
      } 

     } 
    } 
} 

tôi nhận được đối tượng không khớp mục tiêu loại trong Save() chức năng khi tôi cố gắng gọi SetValue(). Tôi ngơ ngác trước sự phản chiếu.Đối tượng không phù hợp với loại mục tiêu khi cố gắng sử dụng SetValue

Trả lời

3

Dường như bạn đang sử dụng một quá tải sai, và thông qua một đối tượng sai:

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

Khu nghỉ dưỡng thuộc về data.ClientBaseObject, vì vậy nó nên là mục tiêu gọi. Không có idexer cho thuộc tính đó, do đó, if you are on .NET 4.5 or later, bạn có thể bỏ qua tham số thứ ba hoàn toàn.

+0

khi tôi biên dịch, nó nói "Không quá tải, mất 2 tham số". Tôi sẽ thử nó với null. –

+0

@DJBurb Ah, tôi không nhận ra rằng quá tải 2-arg là .NET 4.5 chỉ! Quá tải với 'null' sẽ hoạt động. – dasblinkenlight

+0

vâng, tôi đang sử dụng 4.0 –

Các vấn đề liên quan