添加到属性更简单的方法
本文关键字:方法 更简单 属性 添加 | 更新日期: 2023-09-27 18:37:28
我目前必须在列表中加载一些属性,如下所示:
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;
}
我想告诉我的方法应该将它添加到哪个属性。以某种方式可能吗?
编辑:假设我的测试类中有Value2,Value3,Value4等。然后,我无法对我的计算值方法进行硬编码以始终添加到"值"属性中。希望这是有道理的
希望这是有道理的。
此致敬意
可以使用委托将值存储在属性中:
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
中的所有属性或类似的东西。使用方法TryGetMember
和TrySetMember
可以访问属性。
编辑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;