我正在将VB.Net应用程序转换为C#(以及学习C#),我遇到了一个问题。其中一个函数接受一个对象,并根据传递的内容对某些参数应用修改。这样,一个函数可用于更新传递给它的任何控件,这在VB中工作正常。
完整的功能背后有更多的逻辑,但这是一个缩放版本,显示基础:
public void TransformObject(object objObject, int LeftPadding, int TopPadding, int WidthChange, int HeightChange)
{
objObject.Top = TopPadding;
objObject.Left = LeftPadding;
objObject.Width = WidthChange;
objObject.Height = HeightChange;
}
问题是未定义'Top','Left','Width','Height'等,因为它使用的是对象类型。
有没有办法保留现有结构而不必为每种可能的控件类型创建单独的函数或定义?
编辑:我使用的是.Net 3.5框架。
答案 0 :(得分:1)
您可以使用dynamic
:
public void TransformObject(object objObject, int LeftPadding, int TopPadding, int WidthChange, int HeightChange)
{
dynamic dynObject = (dynamic)objObject;
dynObject.Top = TopPadding;
dynObject.Left = LeftPadding;
dynObject.Width = WidthChange;
dynObject.Height = HeightChange;
}
或者找到所有这些类型共有的接口/基类(可能是Control
?)并在方法签名中使用它,而不是object
。
答案 1 :(得分:1)
使用基类,例如MyBaseClass
,其中包含Top
,Left
,Width
和Height
public class MyBaseClass
{
public int Top {get; set;}
public int Left{get; set;}
public int Width {get; set;}
public int Height {get; set;}
}
并且您要传入的每个类都应该从该基类派生
public class MyDerivedClass : MyBaseClass
{
}
答案 2 :(得分:1)
您需要确定传递给函数的对象是实现相同的接口,还是从公开这些属性的同一基类继承。如果他们这样做,那么只需更改函数的接口,以便接受公共接口/基类类型作为参数而不是object
。如果没有,那么你就会有令人讨厌的选择。
答案 3 :(得分:1)
这里的解决方案之一是使用接口。例如,如果我理解你的问题,你可以试试这个:
public interface IMyInterface
{
int Top { get; set;}
int Left { get; set; }
int Width { get; set; }
int Height { get; set; }
}
public void TransformObject(object objObject, int LeftPadding, int TopPadding, int WidthChange, int HeightChange)
{
if (objObject is IMyInterface)
{
((IMyInterface)objObject).Top = TopPadding;
((IMyInterface)objObject).Left = LeftPadding;
((IMyInterface)objObject).Width = WidthChange;
((IMyInterface)objObject).Height = HeightChange;
}
}
代码未优化,但这应该可以解决问题:)
答案 4 :(得分:1)
我猜想传递的object
实际上是Control
(假设这是一个WinForms应用程序)。您可以更改方法签名以指定它并查看是否实际情况,或者您可以将对象强制转换为Control
并进行彻底测试(和/或如果转换失败则添加日志记录:
更改签名:
public void TransformObject(System.Windows.Forms.Control objObject, int LeftPadding, int TopPadding, int WidthChange, int HeightChange)
{
objObject.Top = TopPadding;
objObject.Left = LeftPadding;
objObject.Width = WidthChange;
objObject.Height = HeightChange;
}
内心向下倾斜:
public void TransformObject(object objObject, int LeftPadding, int TopPadding, int WidthChange, int HeightChange)
{
var control = objObject as System.Windows.Forms.Control;
if (control != null)
{
control.Top = TopPadding;
control.Left = LeftPadding;
control.Width = WidthChange;
control.Height = HeightChange;
}
else
{
// Turns out it isn't a control, throw an exception or Log it
}
}
答案 5 :(得分:-3)
在调用方法之前,不要定义对象的新实例。
object obj = new object()
TransformObject(obj,5,5,5,5)
public void TransformObject(object objObject, int LeftPadding, int TopPadding, int WidthChange, int HeightChange)
{
objObject.Top = TopPadding;
objObject.Left = LeftPadding;
objObject.Width = WidthChange;
objObject.Height = HeightChange;
}