C# 需要泛型方法返回类型T,除非T实现接口I,在这种情况下返回I
我有一个泛型方法,它返回一个类型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
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
的形式显式返回对象。你投票否决了我们,因为我们无法从心理上理解你想要的答案与你实际问的不同?太有钱了。