首先,我真的希望我能准确描述我正在寻找的东西,所以如果我不清楚请告诉我,我会尽力澄清。
我有两个类,一个是小类,它被包装到一个列表中。 第二个类使用列表中的值。 以下是这些类的示例。
class FirstClass
{
public string value1 {get; set; }
public string value2 {get; set; }
public string value3 {get; set; }
public string value4 {get; set; }
public string value5 {get; set; }
public string value6 {get; set; }
}
class SecondClass
{
public string FieldName { get; set; }
public string FieldValue { get; set; }
}
List<SecondClass> sc = new List<SecondClass>();
sc[0].FieldName = "value1";
sc[0].FieldValue = "Hello World";
sc[1].FieldName = "value2";
sc[1].FieldValue = "Hello World";
sc[2].FieldName = "value3";
sc[2].FieldValue = "Hello World";
sc[3].FieldName = "value4";
sc[3].FieldValue = "Hello World";
sc[4].FieldName = "value5";
sc[4].FieldValue = "Hello World";
sc[5].FieldName = "value6";
sc[5].FieldValue = "Hello World";
好了,现在你看到那里有两个Classes,你看到SecondClass List如何为每个对象提供两个值,第一个是Field的名称,匹配FirstClass中字段的名称,然后是你的值想要应用于FirstClass中的相应字段。
那么如何将值从一个传输到另一个呢? 上帝,我真的希望我把它清理干净,并没有让它太混乱。
编辑编辑编辑
所以我认为我有一个更好的方法来解释这个使用上面的信息。
索引2中的SecondClass对象
sc[2].FieldName = "value3";
sc[2].FieldValue = "Hello World";
需要将分配给FirstClass
所以sc[2].FieldName = "value3";
在FirstClass
中,他们是一个名为value3
的实际字段,我们需要赋值
sc[2].FieldValue = "Hello World";
字段FirstClass
value3
希望有点清除它。
答案 0 :(得分:4)
这是你在找什么?
FirstClass firstClass = new FirstClass(); // initialize with values.
List<SecondClass> list =
(from prop in FirstClass.GetType().GetProperties()
select new SecondClass()
{
FieldName = prop.Name,
FieldValue = prop.GetValue(firstClass, null)
}).ToList();
答案 1 :(得分:3)
我认为您需要使用Reflection来实现您的目标......即。 typeof(FirstClass).GetProperties
在FirstClass的静态构造函数中,我使用Reflection来获取PropertyInfo实例的Dictionary。我这样做一次,并出于性能原因缓存它。然后,当您调用方法SetValueByReflection
时,它会在字典中查找属性的建议字符串值并设置值。
internal class Program
{
private static void Main(string[] args)
{
List<SecondClass> secondClasses = new List<SecondClass>();
secondClasses.Add(new SecondClass { FieldName = "Value1", FieldValue = "Hello World 1" });
secondClasses.Add(new SecondClass { FieldName = "Value2", FieldValue = "Hello World 2" });
secondClasses.Add(new SecondClass { FieldName = "Value3", FieldValue = "Hello World 3" });
secondClasses.Add(new SecondClass { FieldName = "Value4", FieldValue = "Hello World 4" });
secondClasses.Add(new SecondClass { FieldName = "Value5", FieldValue = "Hello World 5" });
secondClasses.Add(new SecondClass { FieldName = "Value6", FieldValue = "Hello World 6" });
// secondClasses.Add(new SecondClass { FieldName = "Value7", FieldValue = "Hello World 7" }); // This line would throw an Exception
FirstClass fc = new FirstClass();
foreach (SecondClass secondClass in secondClasses)
{
fc.SetValueByReflection(secondClass.FieldName, secondClass.FieldValue);
}
}
}
class FirstClass
{
private static readonly Dictionary<string, PropertyInfo> _publicProperties;
static FirstClass()
{
const BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.SetProperty;
_publicProperties = typeof(FirstClass).GetProperties(bindingFlags).ToDictionary(propertyInfo => propertyInfo.Name);
}
public string Value1 { get; set; }
public string Value2 { get; set; }
public string Value3 { get; set; }
public string Value4 { get; set; }
public string Value5 { get; set; }
public string Value6 { get; set; }
/// <summary>
/// Sets the value of one of the properties of this class as specified by the propertyName parameter.
/// </summary>
/// <exception cref="ArgumentException">Thrown when propertyName is not a valid property of FirstClass.</exception>
public void SetValueByReflection(string propertyName, string value)
{
PropertyInfo propertyInfo;
_publicProperties.TryGetValue(propertyName, out propertyInfo);
if (propertyInfo != null)
{
propertyInfo.SetValue(this, value, null);
}
else
{
throw new ArgumentException("FirstClass does not contain a property of the name " + propertyName, "propertyName");
}
}
}
class SecondClass
{
public string FieldName { get; set; }
public string FieldValue { get; set; }
}
答案 2 :(得分:0)
如果你需要从一个对象到另一个对象进行大量的映射,这是一个很好的工具。为您提供标准的实现方式。