我可以在不强制转换基对象的情况下调用它的方法吗?
本文关键字:调用 情况下 方法 对象 转换 我可以 | 更新日期: 2023-09-27 18:17:10
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 是第三方对象,我无法让编译器知道它遵守此接口。
"很想有一个想法,因为我不需要维护重复的代码。
谢谢-艾德
C# 确实提供了鸭子类型——dynamic
关键字:
((dynamic)_obj).Prop1 = true;
只要_obj
有一个叫做 Prop1
的布尔二传手(大小写很重要(,这将起作用。
另一种方法是下拉到反射级别,它提供了上下搜索属性列表的函数,您可以使用自己的参数调用它们。
这是反射方式:
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 语句中放入您认为必要的任何检查。
只有当这适用时,你只需要用不同的对象调用相同的例程?
public void FunctionA<T>(T obj)
{
//obj.GetType().GetProperty("Prop1").SetValue(obj, true, null);
}