EDIT。对不起,我很抱歉。两个对象都是独立的。 OBJ1实际上来自第三方,我无法访问它的构造函数,因此我使用它的一些功能和我自己的一些功能构建了自己的。
我有一个方法,它将使用OBJ1作为参数调用。 我需要编写完全相同的例程,但将OBJ2作为参数传递。 OBJ1和OBJ2不完全相同,但它们有一个共同的属性:Prop1。
详细信息:OBJ1是没有公共构造函数的第三方对象,因此为了进行测试,我创建了自己的“类似”对象,但与原始对象完全不同。它们有一些共同的属性,包括:Prop1。
我想这样做:
private ObjectTypeA OBJ1 = new ObjectTypeA();
private ObjectTypeB OBJ2 = new ObjectTypeB();
main()
{
GetPlacedOrderIDFromTag(OBJ1);
GetPlacedOrderIDFromTag(OBJ2);
}
private void FunctionA (object _obj)
{
// I know this object has this property.
_obj.Prop1 = true;
}
我尝试实现这样的部分界面:
private partial interface IOrderUserTag { bool Prop1 { get; set; } }
但由于OBJ1是第三方对象,我无法让编译器知道它遵守此接口。
'我喜欢不需要维护重复代码的想法。
谢谢, -Ed
答案 0 :(得分:2)
C#确实提供了鸭子类型 - dynamic
关键字:
((dynamic)_obj).Prop1 = true;
只要_obj
有一个名为Prop1
的布尔设置器(外壳很重要),那就可以工作。
另一种方法是下拉到反射级别,它提供了搜索属性列表的功能,你可以使用自己的参数调用它们。
答案 1 :(得分:2)
这是反思的做法:
public void DoStuff(object obj)
{
PropertyInfo prop = obj.GetType().GetProperty("Prop1");
if (prop != null && prop.PropertyType == typeof(bool) && prop.CanWrite)
{
prop.SetValue(obj, true);
}
}
您可以在if语句中输入您认为必要的任何支票。
答案 2 :(得分:0)
只有在适用的情况下,您只需要使用不同的对象调用相同的例程吗?
public void FunctionA<T>(T obj)
{
//obj.GetType().GetProperty("Prop1").SetValue(obj, true, null);
}