我不确定提出这个问题的最好方法,但我想将一个对象传递给一个方法,并根据对象的类型通过该函数使用该对象。可能还有另一种解决办法让我解释一下情况。
我有一个客户向我返回两个对象(Foo和Bar)。但是,这些对象几乎相同,所以我正在尝试编写一个函数来读取数据。
以下是我想要做的代码片段,但这显然不起作用。
public static void MyFunction(object obj)
{
object order = null;
if (typeof(Foo) == obj.GetType())
{
order = obj as Foo;
}
else
order = obj as Bar;
// get data from order
}
非常感谢任何帮助或指示。
答案 0 :(得分:1)
我怀疑我们作为一个社区可以评论的场景还有很多,例如评论中提到的界面的使用。但是,只知道我们所知道的东西,你可以尝试一些简单的东西,比如:
public static void MyFunction(object obj)
{
Foo foo;
Bar bar;
if ((foo = obj as Foo) != null)
//Work with foo here.
else if ((bar = obj as Bar) != null)
//Work with bar here
}
答案 1 :(得分:0)
如果你真的需要有一个Foo
和Bar
的通用界面,你就不能让他们共享一个基类或实现一个界面(也许他们会在一个你不拥有的程序集,你可以使用适配器模式。
您可以创建一个抽象基类来定义您需要访问的所有属性,然后为您需要操作的每个对象从该基类派生一次。然后,您只需为您拥有的对象类型创建正确的适配器,传入适配器需要调整的对象,并将其存储到基类类型的引用中以供稍后使用。
您可以使用界面而不是抽象类来执行相同操作。
答案 2 :(得分:0)
你基本上有两个选项,它们都要求你有一些共性的元素,比如公共基类或接口声明......对于下面的例子,我使用了一个接口:
public interface IFooBar
{
...
}
// Option 1: Just type the parameter to the interface (the simplest)
public static void MyFunction(IFooBar obj)
{
// get data from order
}
// Option 2: Use a generic type parameter and constraint that it must
// be of type IFooBar (this can be useful for certain reflection scenarios)
public static void MyFuntion<TObject>(TObject obj)
where TObject: IFooBar
{
// get data from order
}
// Option 2a: Same as Option 2 however we take advantage of the constraint
// to inform the the compiler that TObject will have a default parameterless
// constructor so we can actually instantiate TObject
public static void MyFuntion<TObject>(TObject obj)
where TObject: IFooBar, new()
{
// get data from order
...
// We can do this because of the new() constraint
return new TObject();
}