1

我知道 Func<> 用于传递一个方法,该方法具有要在另一个方法中使用的返回值。我知道 Action<> 用于传递一个没有返回值的方法,以便在另一个方法中使用。有没有办法传递一个属性,所以它的 get/set 可以在另一个方法中使用?

例如,这是一个使用 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;  
}  

外面有这样的吗?我什么也找不到。这将非常有用。谢谢。

4

4 回答 4

6

您可以使用 lambda 作为包装器吗?

MyClass myClass = new MyClass();

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

如果你想同时做两个,你会做两个 lambdas,一个用于 set,一个用于 get。

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

我的语法可能不正确,但我认为这给出了这个想法。

于 2012-10-24T20:22:40.763 回答
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);
    }
于 2012-10-24T20:25:09.640 回答
1

为什么不简单地把它当作一个ref论点呢?

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

您现在可以someProperty在方法内部设置 的值。

并这样称呼它:

RangeCheck(min, max, ref myProperty);
于 2012-10-24T20:36:22.113 回答
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;   
}
于 2012-10-24T20:44:42.350 回答