添加到财产更简单的方法?

时间:2015-01-13 08:02:18

标签: c# .net

我目前必须在List中加载一些属性,如下所示:

        List<TestClass> test = new List<TestClass>(); // Loaded with data

        // Get calculated values back as double[]
        double[] calculatedValues = CalculateValue(test);

        // Add the calculated values to the List<TestClass> test object
        for (int i = 0; i < test.Count; i++)
        {
            test[i].Value = calculatedValues[i];
        }


    public int[] CalculateValue(List<TestClass> testClass)
    {
        int[] output = int[testClass.Count];
        // Some calculation
        return output;
    }


    public class TestClass
    {
        public string Name { get; set; }
        public int Value { get; set; }
    }

我真正想做的是这样的事情:

    public static List<TestClass> CalculateValue(List<TestClass> testClass, string property)
    {
        double[] output = double[testClass.Count];
        // Some calculation
        // output to testClass

        // like:
        // testClass.property = output
        // Would then be like: testClass.Value = output
        return testClass;
    }

我想告诉我的方法应该添加哪个属性。 是否有可能以某种方式?

编辑:让我说我的TestClass中有Value2,Value3,Value4等。然后,我不能硬编码我的CalculateValue方法,以始终添加到&#34;值&#34;属性。希望它有意义

希望它有意义。

祝你好运

3 个答案:

答案 0 :(得分:1)

您可以使用委托将值存储在属性中:

List<TestClass> test = new List<TestClass>(); // Loaded with data

// Get calculated values and store in list items
CalculateValue(test, (t, i) => t.Value = i);


public void CalculateValue(List<TestClass> testClass, Action<TextClass, int> store)
{
    int[] output = int[testClass.Count];
    // Some calculation
    for (int i = 0; i < output.Length; i++) {
      store(testClass[i], output[i]);
    }
}

答案 1 :(得分:0)

我认为你正在寻找DynamicObject。使用DynamicObject,您可以编写一个通用动态类,其中包含Dictionary或类似内容中的所有属性。使用方法TryGetMemberTrySetMember,您可以访问属性。

修改 MSDN-示例:

// The class derived from DynamicObject.
public class DynamicDictionary : DynamicObject
{
    // The inner dictionary.
    Dictionary<string, object> dictionary
        = new Dictionary<string, object>();

    // This property returns the number of elements
    // in the inner dictionary.
    public int Count
    {
        get
        {
            return dictionary.Count;
        }
    }

    // If you try to get a value of a property 
    // not defined in the class, this method is called.
    public override bool TryGetMember(
        GetMemberBinder binder, out object result)
    {
        // Converting the property name to lowercase
        // so that property names become case-insensitive.
        string name = binder.Name.ToLower();

        // If the property name is found in a dictionary,
        // set the result parameter to the property value and return true.
        // Otherwise, return false.
        return dictionary.TryGetValue(name, out result);
    }

    // If you try to set a value of a property that is
    // not defined in the class, this method is called.
    public override bool TrySetMember(
        SetMemberBinder binder, object value)
    {
        // Converting the property name to lowercase
        // so that property names become case-insensitive.
        dictionary[binder.Name.ToLower()] = value;

        // You can always add a value to a dictionary,
        // so this method always returns true.
        return true;
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Creating a dynamic dictionary.
        dynamic person = new DynamicDictionary();

        // Adding new dynamic properties. 
        // The TrySetMember method is called.
        person.FirstName = "Ellen";
        person.LastName = "Adams";

        // Getting values of the dynamic properties.
        // The TryGetMember method is called.
        // Note that property names are case-insensitive.
        Console.WriteLine(person.firstname + " " + person.lastname);

        // Getting the value of the Count property.
        // The TryGetMember is not called, 
        // because the property is defined in the class.
        Console.WriteLine(
            "Number of dynamic properties:" + person.Count);

        // The following statement throws an exception at run time.
        // There is no "address" property,
        // so the TryGetMember method returns false and this causes a
        // RuntimeBinderException.
        // Console.WriteLine(person.address);
    }
}

答案 2 :(得分:0)

为什么不使用字典?

public class TestClass
{
    Dictionary<string,double> values = new Dictionary<string,double>

    public Dictionary<string,double> Values {get {return this.values; }}
    public string Name {get;set;}
}

TestClass testClass = new TestClass();
testClass.Values["Value1"] = 5.5;