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

C# 需要泛型方法返回类型T,除非T实现接口I,在这种情况下返回I,c#,generics,interface,C#,Generics,Interface,我有一个泛型方法,它返回一个类型T。现在我想修改它,这样,如果T碰巧实现了接口I,就会在对象上设置一个附加属性(即来自I) 类似这样的事情(当然这不起作用): public myt方法() { T resultAsT=某个函数。。。。 var resultAsI=(resultAsT为I); if(resultAsI!=null) { 结果i.propertyonlayavailableini=99; 返回结果i; } 其他的 返回结果tast; } 这样做可能吗?应该可以: public T

我有一个泛型方法,它返回一个类型T。现在我想修改它,这样,如果T碰巧实现了接口I,就会在对象上设置一个附加属性(即来自I)

类似这样的事情(当然这不起作用):

public myt方法()
{
T resultAsT=某个函数。。。。
var resultAsI=(resultAsT为I);
if(resultAsI!=null)
{
结果i.propertyonlayavailableini=99;
返回结果i;
}
其他的
返回结果tast;
}
这样做可能吗?

应该可以:

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

    var resultAsI = (resultAsT as I);

    if (resultAsI != null)
    {
        resultAsI.PropertyOnlyAvailableInI = 99;
    }
    return resultAsT;
}
public myt方法()
{
T resultAsT=某个函数。。。。
var resultAsI=(resultAsT为I);
if(resultAsI!=null)
{
结果i.propertyonlayavailableini=99;
}
返回结果tast;
}
该方法不能返回除
T
之外的任何内容,因此您应该始终返回
resultAsT

这应该有效:

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

    var resultAsI = (resultAsT as I);

    if (resultAsI != null)
    {
        resultAsI.PropertyOnlyAvailableInI = 99;
    }
    return resultAsT;
}
public myt方法()
{
T resultAsT=某个函数。。。。
var resultAsI=(resultAsT为I);
if(resultAsI!=null)
{
结果i.propertyonlayavailableini=99;
}
返回结果tast;
}

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

,如果您确实想让它工作,那么您可以这样做:

 public object MyMethod()
     {
         object resultAsT = something;

    var resultAsI = (resultAsT as ISomething);

    if (resultAsI != null)
    {
        resultAsI.PropertyOnlyAvailableInI = 99;
        return resultAsI;
    }
    else
        return resultAsT;
}
但在我看来,您希望创建一个实施战略模式的工厂。
当使用策略模式创建对象时,将执行该模式以初始化对象的某些属性。

如果您确实想使其工作,则可以这样做:

 public object MyMethod()
     {
         object resultAsT = something;

    var resultAsI = (resultAsT as ISomething);

    if (resultAsI != null)
    {
        resultAsI.PropertyOnlyAvailableInI = 99;
        return resultAsI;
    }
    else
        return resultAsT;
}
但在我看来,您希望创建一个实施战略模式的工厂。
当使用策略模式创建对象时,将执行该模式以初始化对象的某些属性。

您的方法签名要求您返回T,而不是I。因此,这不起作用。为什么不呢?通过一些铸造技巧和对类型的预先了解,这应该是可能的(但不一定是个好主意)。。。他们只需要做
返回((T)resultAsI)
为了满足方法签名,否?@KyleBaran:因为他们知道对象是
T
,所以他们可以强制转换
resultAsI
。但这并不能解决任何问题。这与只返回
resultAsT
(即,它是同一个对象引用)是一样的,并且它不会按照OP的要求将方法的返回类型更改为
i
。您的方法签名要求您返回t,而不是i。因此这不起作用。为什么不呢?通过一些铸造技巧和对类型的预先了解,这应该是可能的(但不一定是个好主意)。。。他们只需要做
返回((T)resultAsI)
为了满足方法签名,否?@KyleBaran:因为他们知道对象是
T
,所以他们可以强制转换
resultAsI
。但这并不能解决任何问题。这与只返回
resultAsT
(即,它是同一个对象引用)是一样的,并且它不会像OP要求的那样将方法的返回类型更改为
i
。@Laurence:这会如何更改方法的返回类型?返回类型保持不变,事实上,这个示例与您问题中的示例完全相同,只是它总是以
T
的形式显式返回对象。你投票否决了我们,因为我们无法从心理上理解你想要的答案与你实际问的不同?太丰富了。@Laurence:这会如何改变方法的返回类型?返回类型保持不变,事实上,这个示例与您问题中的示例完全相同,只是它总是以
T
的形式显式返回对象。你投票否决了我们,因为我们无法从心理上理解你想要的答案与你实际问的不同?太有钱了。