1

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

我有两个班级,一个是一个小班,它被包装成一个列表。第二个类使用列表中的值。这里是类的例子。

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

好的,现在您看到那里的两个类,并且您看到 SecondClass 列表如何对每个对象有两个值,第一个是与 FirstClass 中的字段名称匹配的字段名称,然后是您要应用的值到 FirstClass 中的相应字段。

那么如何将值从一个转移到另一个?上帝,我真的希望我能把它弄清楚,不要让它太混乱。


编辑 编辑 编辑


所以我认为我有一个更好的方法来使用上面的信息来解释这一点。

索引 2 中的 SecondClass 对象

sc[2].FieldName = "value3";
sc[2].FieldValue = "Hello World";

需要分配到头等舱

所以sc[2].FieldName = "value3";FirstClass他们是一个名为的实际字段value3,我们需要将值分配 sc[2].FieldValue = "Hello World";给该FirstClass字段value3

希望这能澄清一点。

4

3 回答 3

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();
于 2013-07-25T18:47:17.423 回答
3

我认为你需要使用反射来实现你的目标......即typeof(FirstClass).GetProperties

在 FirstClass 的静态构造函数中,我使用反射来获取 PropertyInfo 实例的字典。我这样做一次并出于性能原因将其缓存。然后,当您调用该方法时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; }
}
于 2013-07-26T13:14:14.293 回答
0

如果您必须从一个对象到另一个对象进行大量映射,这是一个很好的工具。给你一个标准的方式来做这件事。

自动映射器

于 2013-07-25T18:42:17.987 回答