我想创建一个程序来在运行时整理未知对象的可变数量的属性。让我更详细地解释一下。 如果我有一个名为'Object1'的对象看起来像这样......
public class Object1()
{
public unknownType1 Property1 { get; set; }
public unknownType2 Property2 { get; set; }
}
然后我们有另一个名为'Object2'的对象看起来像这样......
public class Object2()
{
public unknownType1 Property1 { get; set; }
public unknownType3 Property3 { get; set; }
}
我想在运行时动态整理这些对象以创建类似这样的东西......
public class Object3()
{
public unknownType1 Property1 { get; set; }
public unknownType2 Property2 { get; set; }
public unknownType3 Property3 { get; set; }
}
请注意,两个对象共享相同的Property1。 我已经研究过ExpandoObject,但是因为我不知道在编译时对象或属性是什么类型,所以我认为这不会起作用,因为Exapando会推断出类型。有没有人建议如何处理这个问题?
答案 0 :(得分:0)
您可以尝试Dictionary<string, object>
其中'Key'是属性名称('Property1','Property2',...),'Value'是属性值。
答案 1 :(得分:0)
首先,您需要收集任何对象的属性和值,如下所示:
object[] objectsCollection = new object[] { new StringBuilder(), new ASCIIEncoding() };
foreach(var o in objectsCollection)
{
foreach(PropertyInfo pi in o.GetType().GetProperties())
{
string propertyName = ((MemberInfo)pi).Name;
var propVal = pi.GetValue(o);
//here you can collect properties and values
}
}
在收集了属性名称和值后,可以将其保存在某些集合中,例如Dictionary
答案 2 :(得分:0)
我到目前为止最接近的是匿名类型。如果你这样做......
var Object1s = new List<Object1>() { Object1 };
var Object2s = new List<Object2>() { Object2 };
var object3s = Object1s
.Join(Object2s, o1 => o1.Property1, o2 => o2.Property1,
(o1, o2) => new
{
Property1 = o1.Property1,
Property2 = o1.Property2,
Property3 = o2.Property3
}
).First();
...它生成一个具有所有三个属性的匿名类型。虽然只能将此输出分配给object,但如果可以提供具有先决条件属性的类型,则可以更改新语句以考虑该类型。
这并不完全通用,因为所有属性都已指定,但您可以将新内容更改为这样......
(o1, o2) => new { o1, o2 }
...无论如何都会提供所有重复的属性,并且必须像这样调用object3 ......
object3.o1.Property1,
object3.o1.Property2,
object3.o2.Property3 ...
虽然不理想,但这也有效。一旦我深入了解这些匿名类型,我的想象力就充满了各种各样的可能性。我可以继续,但我认为你得到了主旨......