Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将对象传递到方法并确定类型_C# - Fatal编程技术网

C# 将对象传递到方法并确定类型

C# 将对象传递到方法并确定类型,c#,C#,我不确定问这个问题的最佳方式,但我想将一个对象传递到一个方法中,并根据对象的类型通过函数使用该对象。可能还有另一种解决办法,所以让我解释一下情况 我有一位客户将两件物品(Foo和Bar)退回给我。但是,这些对象几乎是相同的,所以我尝试编写一个函数来读取数据 下面是我想做的一个代码片段,但这显然行不通 public static void MyFunction(object obj) { object order = null;

我不确定问这个问题的最佳方式,但我想将一个对象传递到一个方法中,并根据对象的类型通过函数使用该对象。可能还有另一种解决办法,所以让我解释一下情况

我有一位客户将两件物品(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

        }

任何帮助或指导都将不胜感激。

我想作为一个社区,我们还可以对您的场景进行更多的评论,例如评论中提到的界面的使用。但是,只知道我们知道的,你可以尝试一些简单的方法,比如:

    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
    }

如果您确实需要一个到
Foo
Bar
的通用接口,并且您不能让它们共享基类或实现接口(可能它们位于您不拥有的程序集中),那么您可以使用适配器模式

您可以创建一个抽象基类来定义需要访问的所有属性,然后针对需要操作的每个对象从该基类派生一次。然后,您只需为您拥有的对象类型创建正确的适配器,传入适配器需要调整的对象,并将其存储到基类类型的引用中以供以后使用


您可以对接口而不是抽象类执行相同的操作。

您基本上有两个选项,它们都要求您具有一些公共元素,例如公共基类或接口声明。。。对于下面的示例,我使用了一个接口:

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();
}
公共接口IFooBar
{
...
}
//选项1:只需在接口中键入参数(最简单)
公共静态无效函数(IFooBar obj)
{
//从订单中获取数据
}
//选项2:使用泛型类型参数和它必须使用的约束
//IFooBar类型(这对于某些反射场景很有用)
公共静态无效功能(TObject obj)
对象:IFooBar
{
//从订单中获取数据
}
//方案2a:与方案2相同,但我们利用了约束条件
//通知编译器TObject将具有默认的无参数
//构造函数,以便我们可以实际实例化TObject
公共静态无效功能(TObject obj)
对象位置:IFooBar,new()
{
//从订单中获取数据
...
//我们之所以能够做到这一点,是因为有了new()约束
返回新的TObject();
}

“这些对象几乎完全相同”-使用一个界面。您能更改对象Foo和Bar吗?如果它们足够相似,您可以让它们都实现一个接口,然后为该接口键入您的参数。否则,如果你不能有一个接口,我会使用两个重载,每个重载一个。他们可能有非常相似的代码,但共享代码的其他选项有点混乱和脆弱(至少是我想到的那些)。Foo和Bar来自我无法访问的web服务。Chris——您关于创建重载的想法可能是对的……这很可能是未来更改的最佳选择。
objectorder=obj as TypeName
没有太大用处:因为
order
obj
都是作为
对象键入的,您将无法使用
订单
执行任何特定于类型的操作,而无需更多的强制转换<代码>Foo Foo=obj作为Foo;if(foo!=null).
将为您提供一个可以使用的
foo
对象,或者
null
如果
obj
不是
foo
。您还可以使用
is
操作符:
if(obj是Foo){Foo Foo=(Foo)obj;…}