繁体   English   中英

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

[英]Add to property easier way?

我目前必须在这样的列表中加载一些属性:

        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方法进行硬编码以始终将其添加到“ Value”属性中。 希望有道理

希望有道理。

最好的祝福

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

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

我认为您正在寻找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);
    }
}

为什么不使用字典?

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