2016-04-04 72 views
-1

我有一個類有許多代表客戶的自動字符串屬性。簡而言之,如下所示:減少重複結構的屬性

public class Person 
{  
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

該數據來自客戶端,並使用Nuget包導入許多不同的文件。這些客戶端似乎正在將數據從數據庫生成的系統中複製出來,在這些系統中,我們有時會在某些字段中獲得字面的「NULL」字符串我想通過對現有代碼進行一些簡單的更改來簡化這些操作。我不希望引發錯誤,我只是希望它爲null而不是「NULL」(不是Address2的驗證失敗,而是用於LastName)。

因爲有很多導入,我在沒有源代碼的情況下使用了一個關閉Nuget的庫,所以我無法真正地捕獲到數據。在處理它之前,所有這些都會以相當少量的類結束,所以這似乎是做這件事的地方。我在這裏列出兩個領域,但是有十幾個領域,而且這不僅僅是一個班級。我們也使用ValueInjector很多,所以換一個自定義類的字符串並不是真正的選擇。

我能想到的最好的方法是撤消自動屬性並使用字符串擴展方法進行空檢查。這看起來像是一連串的反覆膨脹。有沒有什麼方法可以在一個屬性上定義這個動作,並且每次都這樣做,而不必將一行代碼轉換成十三十幾次?

public static class StringExtensions 
{ 
    public static string NullMeansNull(this string value) 
    { 
     if (value == "NULL") 
      return null; 
     else 
      return value; 
    } 
} 

public class Person 
{ 
    private string _FirstName; 
    public string FirstName 
    { 
     get 
     { 
      return this._FirstName.NullMeansNull(); 
     } 

     set 
     { 
      this._FirstName = value; 
     } 
    } 

    private string _LastName; 
    public string LastName 
    { 
     get 
     { 
      return this._LastName.NullMeansNull(); 
     } 

     set 
     { 
      this._LastName = value; 
     } 
    } 
} 

注意我不是在談論代碼格式。我們有足夠的StyleCop和CodeAnalysis規則來保持事物類似於上面的擴展,當它實際上是您想要閱讀的代碼時,這是很好的。

+0

http://stackoverflow.com/questions/8388964/how-can-i-inherit-the-字符串類可能會幫助你(隱式操作符 - 使類作爲一個字符串) – Vladimir

+0

這很有趣。我以前從來沒有見過隱式算子。不幸的是,ValueInjector對類型超級挑剔,只有在屬性類型完全相同的情況下才會複製屬性。它甚至不會將Guid複製到Nullable 屬性中。 – icrf

回答

0

我放棄了試圖不觸及每個導入。在導入數據後,我調用了一個通用的擴展方法,該方法查找任何可編輯的字符串屬性,檢查「NULL」或空字符串並將其轉換爲空值。

public static T CleanNullishStrings<T>(this T obj) where T : class 
{ 
    foreach (System.Reflection.PropertyInfo property in obj.GetType().GetProperties()) 
    { 
     if (property.PropertyType == typeof(string) && property.CanRead && property.CanWrite) 
     { 
      string value = (string)property.GetMethod.Invoke(obj, null); 
      value = string.IsNullOrEmpty(value) || value.ToUpper() == "NULL" ? null : value; 
      property.SetMethod.Invoke(obj, new object[] { value }); 
     } 
    } 

    return obj; 
} 

由於一般返回對象傳遞,我可以在突起使用它:

IEnumerable<Person> = personList.Select(p => p.CleanNullishStrings());