需要泛型方法来返回类型T,除非T实现接口I,在这种情况下返回I

时间:2014-11-02 18:23:30

标签: c# generics interface

我有一个返回类型T的泛型方法。现在我想修改它,以便如果T碰巧实现接口I,则在对象上设置一个附加属性(即从I开始)。

像这样(但当然这不起作用):

    public T MyMethod<T>()
    {
        T resultAsT = some function ....

        var resultAsI = (resultAsT as I);

        if (resultAsI != null)
        {
            resultAsI.PropertyOnlyAvailableInI = 99;
            return resultAsI;
        }
        else
            return resultAsT;
    }

这样的事情可能吗?

2 个答案:

答案 0 :(得分:7)

这应该有效:

public T MyMethod<T>()
{
    T resultAsT = some function ....

    var resultAsI = (resultAsT as I);

    if (resultAsI != null)
    {
        resultAsI.PropertyOnlyAvailableInI = 99;
    }
    return resultAsT;
}

该方法无法返回T以外的任何内容,因此您应始终返回resultAsT

答案 1 :(得分:-1)

如果你真的想让它发挥作用,那么你可以这样做:

 public object MyMethod()
     {
         object resultAsT = something;

    var resultAsI = (resultAsT as ISomething);

    if (resultAsI != null)
    {
        resultAsI.PropertyOnlyAvailableInI = 99;
        return resultAsI;
    }
    else
        return resultAsT;
}

但在我看来,你想做一个实现战略模式的工厂。 在使用策略模式创建对象的地方执行初始化对象的某些属性。