【发布时间】:2021-01-18 14:33:48
【问题描述】:
我需要一个具有通用方法的接口。但是,该接口的每个实现都会知道它的类型。
class Program
{
static void Main(string[] args)
{
var specificContext = new SpecificContext();
var res = new SrvThatCantBeGeneric().GetValueFromSpecificContext(specificContext);
Console.WriteLine(res);
}
}
public class SrvThatCantBeGeneric : ISrvThatCantBeGeneric
{
public int GetValueFromSpecificContext<SpecificContext>(SpecificContext specificContext)
{
return specificContext.MyProperty; // <-- this is where it breaks
}
}
public interface ISrvThatCantBeGeneric
{
int GetValueFromSpecificContext<T>( T specificContext);
}
public class SpecificContext
{
public int MyProperty { get; set; } = 42;
}
由于某种原因,当我以上述方式执行此操作时,它不起作用并声明:
“SpecificContext”不包含“MyProperty”的定义,并且找不到接受“SpecificContext”类型的第一个参数的可访问扩展方法“MyProperty”(您是否缺少 using 指令或程序集引用?)
为什么会发生这种情况以及如何解决?
我可以通过像这样移动泛型类型的定义来修复它:
public class SrvThatCantBeGeneric : ISrvThatCantBeGeneric<SpecificContext>
{
public int GetValueFromSpecificContext(SpecificContext specificContext)
{
return specificContext.MyProperty; // <-- this is where it breaks
}
}
public interface ISrvThatCantBeGeneric<T>
{
int GetValueFromSpecificContext( T specificContext);
}
但这会在代码的其他部分中断并且行不通。
编辑:我的代码的简化
【问题讨论】:
-
SpecificContextinGetValueFromSpecificContext<SpecificContext>(BaseContext<SpecificContext> my)不代表类SpecificContext。但它只是表示与常见通用声明中的T相同的通用类型。当您调用该方法时,会提供此方法的实际类型。如obj.GetValueFromSpecificContext<SpecificType>( -
如果你的
T的GetValueFromSpecificContext将只是SpecificContext或SpecificContext的任何派生类,那么你需要有如下方法..int GetValueFromSpecificContext<T>(BaseContext<T> my) where T : SpecificContext;这样你可以在方法体中访问MyPropertyofmy。 -
@ChetanRanpariya 那么为什么第二种方法有效?很抱歉在发布后更改代码,但我能够简化很多。
-
在第二种方法中,当您执行
ISrvThatCantBeGeneric<SpecificContext>时,您声明SrvThatCantBeGeneric类将实现SpecificContext类型的接口,这是特定类型而不是T。