2012-03-22 77 views
1

我有一個類如何檢查對象的某些屬性不爲空在C#

class A { 
    propA { get; set; } 
    propB { get; set; } 
    propC { get; set; } 
    target { get; set; } 
} 

我工作了A類的目標,並填充用戶輸入的類。 每個不同的目標意味着需要不同的屬性(不爲空/空)。

所以如果我的目標是香蕉,那麼propA和propB一定不能是空的。如果蘋果,那麼propB和propC一定不能是空的。我需要這樣做在應用程序的開始跟不上在後一階段做檢查,因爲一些方法和數據庫調用將需要的數據等

什麼是代碼的最佳方式?甚至是設計方面。 在enum中存儲每個目標所需的屬性是否是一種好的做法?然後使用下面提供的lazyberezovsky來檢查?

上面的例子只有3個屬性,但什麼我實際上需要做的多了堆。

我只是開始尋找方法來驗證我的代碼。

總之,這個問題有兩個部分。 - 如何檢查類的屬性是否爲空 - 儲存不同的地方結合所需的屬性的列表來對付如何檢查

編輯:對不起!我已編輯希望更有意義。

+10

屬性總是存在,因爲它們是類定義的一部分。那麼你究竟想要做什麼? – Jon 2012-03-22 07:51:17

+1

你說你的班級是通用的,另一方面,班級本身並不是通用班級。 – daryal 2012-03-22 07:53:17

+3

「你是否存在財產」是指什麼?你的意思是你想檢查一個特定類的實例並驗證指定的屬性是否有一個非空的值集,或者你的意思是你想檢查一個類型並查看它是否實際定義了一組特定的屬性? – PHeiberg 2012-03-22 07:53:56

回答

2

讓我嘗試猜測的問題是怎麼樣:)

這裏是類型驗證,它可以檢查參數的公共屬性的存在:

public class TypeValidator<T> 
{ 
    public bool IsPropertyExists(string propertyName) 
    { 
     Type type = typeof(T); 
     BindingFlags flags = BindingFlags.Instance | BindingFlags.Public; 
     foreach (PropertyInfo property in type.GetProperties(flags)) 
      if (property.Name == propertyName) 
       return true; 

     return false; 
    } 
} 

用法與你的類:

TypeValidator<a> validator = new TypeValidator<a>(); 
validator.IsPropertyExists("PropB") 

或者您可以使用它作爲擴展方法public static bool IsPropertyExists<T>(this T t, string propertyName)與任何對象或通用參數。但對我來說反射是邪惡的:)嘗試通過設計來解決這個問題。

0

我想你的意思是說,當你說一個屬性存在的驗證。

您還沒有指定如果一個網站或Win窗體/ WPF應用程序(或whatelse)。

你可以在你的類實現IDataErrorInfo的和驗證,如果屬性已填權。

有噸的例子來找到IDataErrorInfo的+驗證谷歌搜索時,但這裏有一些這讓我過去:

http://www.arrangeactassert.com/using-idataerrorinfo-for-validation-in-mvvm-with-silverlight-and-wpf/

How to validate child objects by implementing IDataErrorInfo on parent class

1

我認爲你是什麼型號後驗證。如果是這樣,也許一個好地方,把你的驗證邏輯在A類的方法,就像這樣:

Class A 
{ 
    Nullable<int> propA { get; set; } 
    int? propB { get; set; } 
    int? propC { get; set; } 
    string target { 
     get { return _target; } 
     set { 
     var oldtarget = _target; 
     _target = value; 
     if !IsValid() 
     { 
      _target = oldtarget; 
      throw new Exception("Setting target to " 
         + value 
         + " is not possible, ...."); 
     } 
     } 
    } 

    public bool IsValid() 
    { 
     switch (_target) 
     { 
      case "banana": 
       return propA.HasValue() && propB.HasValue(); 

      case "apple": 
       return propB.HasValue() && propC.HasValue(); 
     } 

     return true; 
    } 
} 

如何檢查是propA是空的?取決於propA是什麼......它是一個整數嗎?一個布爾?一個字符串?等等......假設這是一個INT比你可以使用上面的方法...

想不出比的IsValid(更「通用」的驗證),也就是說,我想不出一個更通用不知道更多的方法來驗證...

相關問題