2012-10-24 28 views
1

我知道Func <>用於傳遞一個方法,該方法具有要在另一個方法內使用的返回值。我知道Action <>用於傳遞一個沒有返回值的方法在另一個方法中使用。有沒有辦法傳遞一個屬性,所以它的get/set可以在另一個方法中使用?如果可能的話,如何傳遞C#屬性以便像方法一樣使用?

例如,下面是使用方法Func鍵<>:

public bool RangeCheck (int minVal, int maxVal, Func<< int, int >> someMethod) 
{ 
    bool retval = true; 
    try 
    { 
     for (int count = min; count <= max; count++) 
     { 
      int hello = someMethod(count); 
     } 
    } 
    catch 
    { 
     retval = false; 
    } 
    return retval; 
} 

我所尋找的是這樣的:

public bool RangeCheck(int min, int max, Prop<<int>> someProperty) 
{ 
    bool retval = true; 
    try 
    { 
     for (int count = min; count <= max; count++) 
     { 
      someProperty = count; 
     } 
    } 
    catch 
    { 
     retval = false; 
    } 
    return retval; 
} 

是那裏有什麼樣呢?我找不到任何東西。這將是非常有用的。謝謝。

+3

你可以使用反射,或lambda表達式可以想象這樣做,作爲一個答案提示,或一個包裝類。然而,至少可以這樣說,以這種方式使用屬性讓我感覺非常非常規。 – Mihai

+0

@Mhaihai,如果參數本身包含賦值,會不會發現它是非常規的?這與使用'out'和可讀性幾乎相同。 'RangeCheck(0,10,x => class.Property = x)' – Silvermind

+0

嗯,我總是試圖通過拋出一個值來檢查一個對象,然後看看這個對象是什麼。另外,如果你想在一個對象上設置一個屬性,爲什麼不把對象本身作爲參數? – Mihai

回答

6

你可以使用lambda作爲包裝?

MyClass myClass = new MyClass(); 

bool val = RangeCheck(0, 10,() => myClass.MyProperty); 

如果你想要做兩個,你會做兩個lambda表達式,一個用於設置,另一個用於獲取。

bool val = RangeCheck(0, 10,() => myClass.MyProperty, (y) => myClass.MyProperty = y); 

我的語法可能是關閉的,但我認爲這給出了這個想法。

3

不是我所知道的。您可以嘗試使用反射,並將對象與要獲取其值的屬性的相應PropertyInfo對象一起傳遞。然後調用PropertyInfo的SetValue函數爲它分配一個值(當然,假設它是讀/寫的)。

public void SetMyIntValue() 
    { 
     SetPropertyValue(this, this.GetType().GetProperty("MyInt")); 
    } 

    public int MyInt { get; set; } 

    public void SetPropertyValue(object obj, PropertyInfo pInfo) 
    { 
     pInfo.SetValue(obj, 5); 
    } 
1

爲什麼不簡單地把它作爲ref的說法?

public bool RangeCheck(int min, int max, ref int someProperty) 

您現在可以在方法內設置someProperty的值。

,並調用它像這樣:

RangeCheck(min, max, ref myProperty); 
+0

你不能使用'ref'或'out'作爲屬性。請參閱http://msdn.microsoft.com/en-us/library/4xd8bbw5(v=vs.80).aspx – Silvermind

+0

@Silvermind確實,調用者無法傳遞'ref instance.Prop',他必須使用之後將其分配給屬性。不過,我認爲這個答案提出了最自然的方法簽名。 –

+0

@ default.kramer我認爲muratgu應該把它放在他的答案中以便清楚;)。 – Silvermind

0

你可以使用一個Func這樣Func<int, T>

void Main() 
{ 
    var sc = new SimpleClass(); 
    var result = RangeCheck(0, 10, x => sc.Value = x); 
    System.Console.WriteLine(result); 
    System.Console.WriteLine(sc.Value); 
} 

public class SimpleClass 
{ 
    public int Value { get; set; } 
} 

public bool RangeCheck<T>(int minVal, int maxVal, Func<int, T> someMethod) 
{ 
    bool retval = true; 
    try 
    { 
     for (int count = minVal; count <= maxVal; count++) 
     { 
      //someMethod(count); //is not a range check, 
      //Did you mean 
      someMethod(count - minValue); 
     } 
    } 
    catch 
    { 
     retval = false; 
    } 
    return retval; 
} 
相關問題