C# 如果在继承的栏位(Property)中判断是不是实现某接口的自定义属性(Attribute)的栏位?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 如果在继承的栏位(Property)中判断是不是实现某接口的自定义属性(Attribute)的栏位?相关的知识,希望对你有一定的参考价值。

如:interface ITest
[Igore]
string IgoreFieldget;set;

class IgoreAttribute : Attribute

class TestIgore : ITest
public string Aget;set;
public IgoreFieldget;set;

使用的情况是:
TestIgore t = new TestIgore();
t.GetType().GetProperty("IgoreField").GetCustomAttribute(typeof(IgoreAttribute)) == null ???
问号的地方就是我想得到的应该不是null,但这样写得到的确实是null。

问问大侠们有没方法可以判断TestIgore的IgoreField是拥有IgoreAttribute的自定义属性的呢?

虽然已经过了五年了?

刚好也遇到这个问题

我突然来的灵感是公共属性可以用基类而不是接口

应该可以吧

我去试试,

ok可以的

public class BaseModel
    
        public BaseModel() 
        [ModelProperty(true, "唯一标识bh:可以查询", false, false, false)]
        public string bh  get; set; 
        [ModelProperty(true, "唯一标识ID:可以查询",false,false,false)]
        public int id  get; set; 
        [ModelProperty(false, "非表内字段:表名")]
        public string tableName  get; set;  
    
    public class User:BaseModel
      
        [ModelProperty(true, "用户名:支持所有操作")]
        public string username  get; set; 
        public string password  get; set; 
        public int role  get; set; 
        public int canLogin  get; set; 
        public string tel  get; set; 
        public string email  get; set; 
        [ModelProperty(true, "注册日期:仅支持查看和新增",true,false,false,true)]
        public DateTime regDate  get; set; 
        public User() 
            //未初始化的datetime在作为SqlParameter时查询会报错,因此给个正常格式的值,占位
            regDate = DateTime.Now;
            this.tableName = "userinfo";
        
    
    public List<T> Select(string sql, T model, CommandType cmdType = CommandType.Text)
        
            SqlDataReader dr = QueryDataReader(sql, model, cmdType);
            List<T> modelList = new List<T>();
            while (dr.Read())
            
                T t = new T();
                Type type = t.GetType();
                PropertyInfo[] properties = type.GetProperties();
                foreach (PropertyInfo propertie in properties)
                
                    if (propertie != null && propertie.CanRead && propertie.CanWrite)
                    
                        ModelPropertyAttribute attr;
                        try
                        
                            attr = (ModelPropertyAttribute)propertie.GetCustomAttribute(Type.GetType("Tools.ModelPropertyAttribute")); 
                        
                        catch(Exception ex)
                        
                            throw new Exception("未获取到PropertyInfo的CustomAttribute,或许未设置?"+ex.Message);
                        
                        if (attr!=null)
                        
                            //只有特性标记允许选择才赋值
                            if (attr.Select)
                            
                                string key = propertie.Name;
                                object value = null;
                                try
                                
                                    value = dr[key];
                                
                                catch
                                

                                
                                propertie.SetValue(t, value);
                            
                         
                    
                
                modelList.Add(t);
            
            dr.Close();
            dr.Dispose();
            return modelList;
        

参考技术A http://zhidao.baidu.com/question/463694369.html
你参考下,你的写法有点问题。
注意这句
AllowExecuteAttribute att = Attribute.GetCustomAttribute(mi, typeof(AllowExecuteAttribute)) as AllowExecuteAttribute;
if (att == null)
return;追问

答非所问,我手打的肯定有错误,不过你还没懂我意思?

追答

怎么答非所问呢?你不是问
“有没方法可以判断TestIgore的IgoreField是拥有IgoreAttribute的自定义属性的呢?”
我给你的连接判断的是方法有没有Attribute,你就判断字段呗。
要是有出处请说明下

追问

你已经修改了我的代码~~~
修改的内容:在已知类的情况下添加了一个识别(IgoreAttribute)用来判断结果.

我需要的是:不知道那个类是什么类型,但我知道如果他实现了这个接口(ITest),那么就要排除
接口中的标记有Igore的此属性~

参考技术B

象下面这样

    private class TestIgore : ITest
    
        public string A  get; set; 
        [Igore]
        public string IgoreField  get; set; 
    

追问

这个只能用在TestIgore上面,我是想用在ITest上面来达到实现此接口的类的这个属性(IgoreField要忽略处理。
我的问题在于如何在知道接口但不知道类的情况下找出类中有哪些Property是来源这个接口的自定义属性(Igore)标签?

追答

没看明白你想干什么,看下面这么做能不能符合你的要求


    [STAThread]
    public static void Main(string[] args)
    
        var t = new TestIgore();
        var propertyInfo = t.GetType().GetProperty("IgoreField");
        var attribute = propertyInfo.GetCustomAttribute<IgoreAttribute>();
        Console.WriteLine(attribute);

        Console.ReadKey();
    

    private interface ITest
    
        string IgoreField  get; set; 
    

    private abstract class TestBase : ITest
    
        [Igore]
        public abstract string IgoreField  get; set; 
    


    private class IgoreAttribute : Attribute
    
    

    private class TestIgore : TestBase
    
        public string A  get; set; 

        public override string IgoreField  get; set; 
    
    
    // 下面的地址上有人实现了你要求的类似实现,但是他使用的方法,而且测试的调用写在实现的子类的函数中,我按你的例子进行了测试,但是没有成功,你自己试试吧。
    // 不过个人意见,这么复杂的实现,你想想能不能改个思路,用其它手段实现你的需求
    // http://stackoverflow.com/questions/251806/attributes-on-an-interface

追问

你说的结果有点对胃哦~
这个也是最初想到的答案:用基类来确定该属性有标记为Igore且是从ITest中实现的。

看大哥您那能想出很好的方法吗?目的就是未知类的情况下找出实现该接口的类中除开有接口的特殊标记(这儿是Igore)的该类的property

追答

象我上在贴的stackoverflow地址中表示的一样,应该是可以实现的,但是我按里面的原理来测试时没有成功。你可以再试试。还有按里面的代码,子类要求显示实现接口函数才行。

要么就是象我上面写的一样,设置基类,在基类上打标记。

还有就是简单一些处理,检测未知类是否实现了某接口,如果实现的话,那么该接口同名的属性就认为是需要排除的属性。比如检测对象是否实现了ITest接口,如果实现的话,那么对象中的如IgoreField 属性就是排除属性。

本回答被提问者采纳
参考技术C 这个本来不就应该返回null吗?你的IgoreField里又不包含IgoreAttribute。追问

是的,我那写法本来就是错误的啊,要不找你们解决干什么呢?
我的目的是找出一个方法得到为真~~~

追答

你要把 IgoreAttribute 和 你的IgoreField 关联起来呀
你现在的IgoreField 是一个string,肯定不能通过它来得到IgoreAttribute 啊
而且,你的IgoreField 如果没有初值,会默认为NULL,你也是不可能通过一个NULL值来反射得到IgoreAttribute 的。
所以,你可以这样:

class IgoreAttribute : Attribute



class Filed

[Igore]
public IgoreAttribute IgoreAttri get; set;

interface ITest

[Igore]
Filed IgoreField get; set;


class TestIgore : ITest

public TestIgore()

IgoreField = new Filed();

public string A get; set;
[Igore]
public Filed IgoreField get; set;


然后调用时:
TestIgore t = new TestIgore();
string str = t.GetType().GetProperty("IgoreField").GetCustomAttributes(typeof(IgoreAttribute), true)[0].ToString()

追问

我的要求和目的是:
在类未知的情况下排除实现此接口(ITest)中含有Igore自定义attribute的property`
你的做法我知道可以,但违背了实际应用的原则,不成立啊~~~
还有其他可以做到此解决方法的都可以,不一定用attribute。
目的就是找出实现该接口的类中除开有特殊标记(这儿是Igore)的property

以上是关于C# 如果在继承的栏位(Property)中判断是不是实现某接口的自定义属性(Attribute)的栏位?的主要内容,如果未能解决你的问题,请参考以下文章

navicat for MySQL怎么导出SQL脚本

SQL 排序

join命令

.Net C# DataGridView设置标题为中文

SQL语句总结

向SAP导入EXCEL表报金额为空,这个错怎么找啊