C# 检查T对象是否具有属性和set属性

C# 检查T对象是否具有属性和set属性,c#,generics,windows-runtime,C#,Generics,Windows Runtime,你好,我有一个通用的方法 public async Task<T> MyMethod<T>(...) { //logic here... } 但是它似乎不起作用。如果您控制所有使用MyMethod的可能类型,最简单的选择是创建一个定义所需属性的接口: public interface IThing { IList<Error> Errors { get; } } public接口信息 { IList错误{get;} } 并更改方法签名: pub

你好,我有一个通用的方法

public async Task<T> MyMethod<T>(...)
{
 //logic here...
}

但是它似乎不起作用。

如果您控制所有使用
MyMethod
的可能类型,最简单的选择是创建一个定义所需属性的接口:

public interface IThing
{
    IList<Error> Errors { get; }
}
public接口信息
{
IList错误{get;}
}
并更改方法签名:

public async Task<T> MyMethod<T>(...) where T : IThing
公共异步任务MyMethod(…),其中T:Iting

如果这样做,传入的每个项都必须实现您的接口,因此会产生一个
错误
属性。

您应该使用
对象获取对象的运行时类型。GetType
,然后您可以检查它是否具有特定属性,如果是,则调用:


default(T)
如果T是引用类型,则返回
null
。您正在尝试使用null创建动态对象并访问其属性。您可以传入T的实例,也可以使用new()泛型约束实例化一个实例,但是如果它没有默认构造函数呢?为什么不使用泛型约束和定义所需属性的接口呢,强制
T
拥有这个属性?我不想强制这个属性。这不是泛型应该使用的方式。很可能,使用不同于泛型的方法会更好。是的,这很好,但是我如何检查传递的对象是否有属性?我想忽略没有特定属性的对象。为什么
等待任务。延迟
?就为了让编译器警告消失?
public async Task<T> MyMethod<T>(...) where T : IThing
PropertyInfo pi = obj.GetType().GetProperty("PropertyName");
if (pi != null)
{
    pi.SetValue(obj, value);
}