转换为新对象,按属性名复制值

时间:2010-05-24 04:08:20

标签: c# casting

我有以下内容:

Class 1 (Text, State, Level)
Class 2 (Text, State, Level, Ident)

我有没有办法将Class 2的对象转换为Class 1,而不必执行通常的强制转换代码(Text = c.Text,State = c.State等)?可能通过识别每个类的属性名称并将值复制过来?

3 个答案:

答案 0 :(得分:3)

为什么不从Class 2派生Class 1,或者有一个共同的基类?

e.g。

class Class1 
{ 
   string Text;
   string State; 
   int    Level; 
} 

class Class2 : Class1 
{ 
   int Ident;
   // ...
}

现在可以在需要Class 2实例的任何地方使用Class 1实例。

答案 1 :(得分:1)

这是一个非常简单的示例,没有任何错误检查,它只是使用反射来迭代源对象的属性,并仅在类型匹配时设置目标对象的值。

class Program
{
    static void Main(string[] args)
    {
        var bar = new Bar();
        var foo = new Foo {A = 10, B = "Hello World"};

        foo.CopyTo(bar);

        Console.WriteLine("{0} - {1}", bar.A, bar.B);
    }
}

public static class Extensions
{
    public static void CopyTo(this object source, object destination)
    {
        var sourceType = source.GetType();
        var destinationType = destination.GetType();

        const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;

        var properties = sourceType.GetProperties(flags);
        foreach (var sourceProperty in properties)
        {
            var destinationProperty = destinationType.GetProperty(sourceProperty.Name, flags);
            if (destinationProperty.PropertyType.Equals(sourceProperty.PropertyType))
            {
                destinationProperty.SetValue(destination, sourceProperty.GetValue(source, null), null);
            }
        }
    }
}

答案 2 :(得分:1)

也许这个问题比问题更复杂。如果没有,你试过继承吗?

class Class1
{
  //Text, State, Level
}

class Class2 : Class1
{
  //Indent
} 

由于Class2继承自类1,因此可以将其作为Class1传递而不需要进行转换。这适用于例如:

Class1 obj = new Class2();