根据另一个对象的反射设置 属性 类型

Set property type based on reflection of another object

假设我有两个 classes:

public class IntKeyObject{
     public int Id {get;set;}
     [ForeignKey]
     public int ForeignKey {get;set;}
     public string SomeProperty {get;set;}
     ...
}
public class StringKeyObject{
     public string Id {get;set;}
     [ForeignKey]
     public string ForeignKey {get;set;}
     public string SomeOtherProperty {get;set;}
}

我希望能够制作一个这样的容器 class:

public class ObjectViewModel<T>{
     public [the type of the objects key] ForeignKey {get;set;}
     public IEnumerable<T> MyList {get;set;}
}

我像下面这样初始化它:

new ObjectViewModel<IntKeyObject>();

有没有办法在对象类型上使用反射来设置我的 ForeignKey 属性 类型? 现在我知道如何做到这一点的唯一方法是像这样显式传递 Key 类型:

new ObjectViewModel<IntKeyObject, int>();
new ObjectViewModel<StringKeyObject, string>();

我更愿意通过推断来设置该类型。我知道如何通过获取属性从 class 中找到正确的 属性 类型,我不确定的是如何设置我的容器 class.

属性 的类型需要在编译时知道。

 public [the type of the objects key] ForeignKey {get;set;}

无法在编译时设置[the type of the objects key]

但是,您可以有一些选择:

  1. 使用'object'
  2. 创建多个类型并使用一个工厂来检查密钥的类型并使用它。
  3. 对所有 ObjectViewModel 对象使用字符串 - 将 int 键字符串化