C# 类及其接口之间的引用转换
我有一个实现接口的类:C# 类及其接口之间的引用转换,c#,C#,我有一个实现接口的类: public interface IMyInterface { string MY_VALUE { get; set; } } public class MyClass: IMyInterface { public string MY_VALUE { get; set; } } 我正在列表中使用该类: private List<MyClass> MyInternal; public List<IMyInterface> MyEx
public interface IMyInterface
{
string MY_VALUE { get; set; }
}
public class MyClass: IMyInterface
{
public string MY_VALUE { get; set; }
}
我正在列表中使用该类:
private List<MyClass> MyInternal;
public List<IMyInterface> MyExternal
{
get
{
return MyInternal;
}
}
这将失败,因为MyExternal没有映射到MyInternal,而是映射到一个新列表。如何实现此功能?即使
MyClass
实现了MyInterface
,也不能将List
转换为List
如果可以将其转换为列表
,则必须能够向其中添加实现MyInterface
的任何内容,即使它不是MyClass
。如果您可以将其转换为一个列表
,将该引用传递给另一个方法,那么该方法会“认为”它可以向该列表添加其他内容,而实际上该列表中唯一可以添加的内容是MyClass
。我们从未遇到过这种情况,因为编译器会阻止它
如果您有一个列表
并且想要一个列表
,您可以这样做
var listOfMyInterface = listOfMyClass.Cast<MyInterface>().ToList();
var listOfMyInterface=listOfMyClass.Cast().ToList();
想象一下我做了一个
public class MyClass2: IMyInterface
{
public string MY_VALUE { get; set; }
}
然后我做到了
someClass.MyExternal.Add(new MyClass2())
它必须将MyClass2
添加到私有列表MyInternal
对象中,这是不允许的。这就是为什么你不能这么做
要绕过它,您必须公开一个共变接口(只允许读取列表,不允许写入,并且类型为out T
),这就是接口的用途,并且list
实现该接口
private List<MyClass> MyInternal;
public IReadOnlyList<IMyInterface> MyExternal
{
get
{
return MyInternal;
}
}
您真的希望列表中有任何实现接口的对象,还是只希望列表中有
MyClass
实例?你不能两者兼得;所以只要选择一个。列表
不是协变的。如果将MyExternal
定义为IEnumerble
,则可以从中返回List
,因为IEnumerable
不允许传递可能不是MyClass
的IMyInterface
。但听起来,如果您计划添加到列表中,您只想公开List
IEnumerable@YongkeBillYu事实上,因为增加的能力是它不起作用的原因。那种挫败了我服务的目的
someClass.MyExternal.Add(new MyClass2())
private List<MyClass> MyInternal;
public IReadOnlyList<IMyInterface> MyExternal
{
get
{
return MyInternal;
}
}
private List<IMyInterface> MyInternal;
public List<IMyInterface> MyExternal
{
get
{
return MyInternal;
}
}