从对象列表中填充类C#

时间:2013-07-25 18:40:37

标签: .net c#-4.0

首先,我真的希望我能准确描述我正在寻找的东西,所以如果我不清楚请告诉我,我会尽力澄清。

我有两个类,一个是小类,它被包装到一个列表中。 第二个类使用列表中的值。 以下是这些类的示例。

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

希望有点清除它。

3 个答案:

答案 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)

如果你需要从一个对象到另一个对象进行大量的映射,这是一个很好的工具。为您提供标准的实现方式。

AutoMapper