检查 T 泛型类型在 c# 中具有属性 S(泛型)

本文关键字:属性 泛型 泛型类型 检查 | 更新日期: 2023-09-27 18:33:07

class A

class A{
...
}

B类

 class B:A{
    ...
 }

C类

 class C:A{
    B[] bArray{get;set;}
 }

我想检查 T 的属性类型是否为 S,创建 S 的实例并分配给该属性:

public Initial<T,S>() where T,S : A{
   if(T.has(typeof(S))){
      S s=new S();
      T.s=s;
   }
}

检查 T 泛型类型在 c# 中具有属性 S(泛型)

最好和最简单的方法是使用接口实现此功能。

public interface IHasSome
{
    SomeType BArray {get;set;}
}
class C:A, IHasSome
{
    public SomeType BArray {get;set;}
}

然后,可以在泛型方法中强制转换对象:

public T Initial<T,S>() where T : new() where S : SomeType, new()
{
    T t = new T();
    if (t is IHasSome)
    {
        ((IHasSome)t).BArray = new S();
    }
    return t;
}

如果这不合适,可以使用反射来检查属性并检查其类型。相应地设置变量。

我同意@PatrickHofman这种方式更好,但是如果您希望某些更通用的东西为类型的所有属性创建一个新实例,则可以使用反射来做到这一点:

public T InitializeProperties<T, TProperty>(T instance = null) 
    where T : class, new()
    where TProperty : new()
{
    if (instance == null)
        instance = new T();
    var propertyType = typeof(TProperty);
    var propertyInfos = typeof(T).GetProperties().Where(p => p.PropertyType == propertyType);
    foreach(var propInfo in propertyInfos)
        propInfo.SetValue(instance, new TProperty());
    return instance;
}

然后:

// Creates a new instance of "C" where all its properties of the "B" type will be also instantiated
var cClass = InitializeProperties<C, B>();
// Creates also a new instance for all "cClass properties" of the "AnotherType" type
cClass = InitializeProperties<C, AnotherType>(cClass);