我有以下内容:
Class 1 (Text, State, Level)
Class 2 (Text, State, Level, Ident)
我有没有办法将Class 2的对象转换为Class 1,而不必执行通常的强制转换代码(Text = c.Text,State = c.State等)?可能通过识别每个类的属性名称并将值复制过来?
答案 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();