简体   繁体   English

添加到属性更简单的方法?

[英]Add to property easier way?

I currently have to load some properties in a List like this: 我目前必须在这样的列表中加载一些属性:

        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; }
    }

What I really would like to do is something like this: 我真正想做的是这样的:

    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;
    }

I would like to tell my method which property it should be added to. 我想告诉我的方法应将其添加到哪个属性。 Is it possible in some way? 有可能吗?

EDIT: Lets say I have Value2, Value3, Value4 etc. in my TestClass. 编辑:可以说我的TestClass中有Value2,Value3,Value4等。 Then I can not hardcode my CalculateValue method to always add to the "Value" property. 然后,我无法对自己的CalculateValue方法进行硬编码以始终将其添加到“ Value”属性中。 Hope it makes sense 希望有道理

Hope it makes sense. 希望有道理。

Best regards 最好的祝福

You can use a delegate for storing the value in a property: 您可以使用委托将值存储在属性中:

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]);
    }
}

I think you are look for DynamicObject . 我认为您正在寻找DynamicObject With DynamicObject you can write a general dynamic class, to which contains all properties in a Dictionary or something similar. 使用DynamicObject,您可以编写一个通用的动态类,该类包含Dictionary或类似内容中的所有属性。 With the methods TryGetMember and TrySetMember you can access the properties. 使用TryGetMemberTrySetMember方法,您可以访问属性。

EDIT MSDN-Example: 编辑 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);
    }
}

Why don't you use a Dictionary? 为什么不使用字典?

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM