我的代码类似于bellow
public interface IFoo
{
int One { get; set; }
string Two { get; set; }
}
public class Foo : IFoo
{
public int One { get; set; }
public string Two { get; set; }
}
public class SomeDto<T>
where T : IFoo
{
public T Fik { get; set; }
public string Faj { get; set; }
}
class Program
{
static void Main(string[] args)
{
var fik = new SomeDto<Foo>() { Fik = new Foo() { One = 1, Two = "ss" }, Faj = "ss" };
var obj = (Object)fik;
// the problematic part
//=======================
var fikl = fik as SomeDto<IFoo>; //do something like that
//or
var fikl = (SomeDto<IFoo>)fik; //do something like that
}
}
我如何解决这个有问题的部分。做一些类似的东西,允许拆箱一般的类,但更像一般的接口。
我需要这个,因为我有一个基于泛型的数据源构建的组合框。我需要在列表中找到项目,使用某些属性形成通用值。
答案 0 :(得分:3)
1)没有关于装箱/拆箱的内容
2)您无法做到这一点,因为SomeDto<IFoo>
和SomeDto<Foo>
彼此不变。这意味着即使&#34; IFoo
可以从Foo
&#34;你不能说&#34; SomeDto<IFoo>
可以从SomeDto<Foo>
&#34;反之亦然。
与您的意图类似的是使用协变/逆变通用接口(因为只有委托和接口支持该技巧)。 例如:
interface IFoo
{
int Int { get; set; }
}
class Foo : IFoo
{
public int Int { get; set; }
}
interface IDto<out T> where T : IFoo
{
T Obj { get; }
}
class Dto<T> : IDto<T> where T : IFoo
{
public T Obj { get; set; }
}
因此您可以将IDto<Foo>
分配给IDto<IFoo>
:
static void Main(string[] args)
{
Foo foo = new Foo();
IDto<IFoo> dto = new Dto<IFoo>() {Obj = foo};
object obj = dto;
dto = (IDto<Foo>) obj;
}