检查 T 对象是否有 属性 并设置 属性
Check if T object has a property and set property
你好,我有一个通用方法
public async Task<T> MyMethod<T>(...)
{
//logic here...
}
我想在此方法中检查 T 对象是否具有特定的 属性,然后为此设置一个值 属性:
我试过创建动态对象并执行如下操作:
var result = default(T);
dynamic obj = result;
Error error = new Error();
error.Message = "An error occured, please try again later.";
error.Name = "Error";
obj.Errors.Add(error);
result = obj;
return result;
不过好像不行。
如果您控制使用 MyMethod
的所有可能类型,最简单的选择是创建一个接口来定义您需要的属性:
public interface IThing
{
IList<Error> Errors { get; }
}
并更改方法签名:
public async Task<T> MyMethod<T>(...) where T : IThing
如果你这样做,传入的每个项目都必须实现你的接口,因此有一个 Errors
属性.
您应该使用 object.GetType
获取对象的运行时类型,然后您可以使用 Type.GetProperty
, and if yes, call PropertyInfo.SetValue
检查它是否具有特定的 属性 :
PropertyInfo pi = obj.GetType().GetProperty("PropertyName");
if (pi != null)
{
pi.SetValue(obj, value);
}
你好,我有一个通用方法
public async Task<T> MyMethod<T>(...)
{
//logic here...
}
我想在此方法中检查 T 对象是否具有特定的 属性,然后为此设置一个值 属性:
我试过创建动态对象并执行如下操作:
var result = default(T);
dynamic obj = result;
Error error = new Error();
error.Message = "An error occured, please try again later.";
error.Name = "Error";
obj.Errors.Add(error);
result = obj;
return result;
不过好像不行。
如果您控制使用 MyMethod
的所有可能类型,最简单的选择是创建一个接口来定义您需要的属性:
public interface IThing
{
IList<Error> Errors { get; }
}
并更改方法签名:
public async Task<T> MyMethod<T>(...) where T : IThing
如果你这样做,传入的每个项目都必须实现你的接口,因此有一个 Errors
属性.
您应该使用 object.GetType
获取对象的运行时类型,然后您可以使用 Type.GetProperty
, and if yes, call PropertyInfo.SetValue
检查它是否具有特定的 属性 :
PropertyInfo pi = obj.GetType().GetProperty("PropertyName");
if (pi != null)
{
pi.SetValue(obj, value);
}