Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何测试属性是否已声明为;动态的;?_C#_System.reflection - Fatal编程技术网

C# 如何测试属性是否已声明为;动态的;?

C# 如何测试属性是否已声明为;动态的;?,c#,system.reflection,C#,System.reflection,正如标题所说,在使用反射时,如何测试属性是否已声明为动态 不幸的是使用!在我的例子中,pi.PropertyType.IsValueType不够具体。我找到的唯一方法是查看pi.CustomAttributes数组,并测试它是否包含AttributeType为DynamicAttribute的项。有没有更好的方法来实现这一目标 public class SomeType { public dynamic SomeProp { get; set; } } // ... foreach

正如标题所说,在使用反射时,如何测试属性是否已声明为
动态

不幸的是使用
!在我的例子中,pi.PropertyType.IsValueType
不够具体。我找到的唯一方法是查看
pi.CustomAttributes
数组,并测试它是否包含
AttributeType
DynamicAttribute
的项。有没有更好的方法来实现这一目标

public class SomeType
{
    public dynamic SomeProp { get; set; }
}

// ...

foreach (var pi in typeof(SomeType).GetProperties())
{
    if (pi.PropertyType == typeof(string)) { } // okay
    if (pi.PropertyType == typeof(object)) { } // okay 
    if (pi.PropertyType == typeof(dynamic)) { } // The typeof operator cannot be used on the dynamic type
}

谢谢你的回复。我就是这样解决的:

public static class ReflectionExtensions
{
    public static bool IsDynamic(this PropertyInfo propertyInfo)
    {
        return propertyInfo.CustomAttributes.Any(p => p.AttributeType == typeof(DynamicAttribute));
    }
}
如果你把你的代码放进去,你可以看到你的代码在幕后发生了什么

using System;
public class C {
    public dynamic SomeProp { get; set; }
    public void M() {
        SomeProp = 3;
    }
}
转换为(为了可读性删除了一些内容):

使用系统诊断;
运用系统反思;
使用System.Runtime.CompilerServices;
使用系统安全;
使用System.Security.Permissions;
公共C类
{
[动态]
私有对象k__BackingField;
[动态]
公共对象属性
{
[返回:动态]
得到
{
返回k__BackingField;
}
[参数:动态]
设置
{
k__BackingField=值;
}
}
公屋
{
SomeProp=3;
}
}
SomeProp
属性只是.Net运行时的一个普通
对象。附加了
[Dynamic]
属性

无法测试动态类型,因为它不是
SomeProp
的类型。您应该测试是否存在
[Dynamic]
属性。

如果您将代码放入,您可以看到代码在幕后发生了什么

using System;
public class C {
    public dynamic SomeProp { get; set; }
    public void M() {
        SomeProp = 3;
    }
}
转换为(为了可读性删除了一些内容):

使用系统诊断;
运用系统反思;
使用System.Runtime.CompilerServices;
使用系统安全;
使用System.Security.Permissions;
公共C类
{
[动态]
私有对象k__BackingField;
[动态]
公共对象属性
{
[返回:动态]
得到
{
返回k__BackingField;
}
[参数:动态]
设置
{
k__BackingField=值;
}
}
公屋
{
SomeProp=3;
}
}
SomeProp
属性只是.Net运行时的一个普通
对象。附加了
[Dynamic]
属性

无法测试动态类型,因为它不是
SomeProp
的类型。您应该测试是否存在
[Dynamic]
属性。

定义“更好”。为什么(你提到的
[dynamiccatribute]
对你来说“足够好”?定义“更好”的可能重复。为什么(你提到的
[DynamicAttribute]
对你来说“足够好”呢?可能是重复的