C# 定义自定义属性类,使属性在某些情况下可浏览

C# 定义自定义属性类,使属性在某些情况下可浏览,c#,winforms,attributes,browsable,C#,Winforms,Attributes,Browsable,我的项目中有一些类,一些属性是可浏览的(false),因此用户无法看到它们: public class OrderEntity{ public int Id { get; set;} [Browsable(false)] public int ProductId { get; set;} .... } 我想,如果最终用户是Admin,他可以看到ProductId,但是其他用户看不到它 所以我需要这样的东西: public class OrderEnt

我的项目中有一些类,一些属性是可浏览的(false),因此用户无法看到它们:

public class OrderEntity{
    public int Id { get; set;}   
    [Browsable(false)]
    public int ProductId { get; set;}   
    ....
}
我想,如果最终用户是Admin,他可以看到
ProductId
,但是其他用户看不到它

所以我需要这样的东西:

public class OrderEntity{
    public int Id { get; set;}   
    [CustomizedBrowsable(false)]
    public int ProductId { get; set;}   
    ....
}


public class CustomizedBrowsable: Attribute
{
  if(AppContext.UserCode == "Admin") // The current user code saved in a static variable AppContext.UserCode.
    //do somethings   
  else
    //do somethings else 
}

这不是通过属性可以实现的,因为
BrowsableAttribute
密封的
。要通过绑定实现这一点,您需要一个自定义类型描述符-因此您需要在您的类型上实现
ICustomTypeDescriptor
(直接或通过
TypeDescriptionProvider
),提供自定义
PropertyDescriptor
,并更改可浏览性的定义方式(
IsBrowsable
,IIRC)

这是一吨的工作


坦白地说,在几乎所有情况下,最好只是手动控制绑定,并在检查安全级别后只添加列/输入/任何内容。

我使用
可浏览
类代码定义了自己的
可管理
类:

[AttributeUsage(AttributeTargets.All)]
public sealed class AdminBrowsableAttribute : Attribute
{
    /// <summary>
    /// Specifies that a property or event can be modified at design time. This static field is read-only.
    /// </summary>
    public static readonly AdminBrowsableAttribute Yes = new AdminBrowsableAttribute(true);
    /// <summary>
    /// Specifies that a property or event cannot be modified at design time. This static field is read-only.
    /// </summary>
    public static readonly AdminBrowsableAttribute No = new AdminBrowsableAttribute(false);
    /// <summary>
    /// Specifies the default value for the <see cref="T:System.ComponentModel.BrowsableAttribute"/>, which is <see cref="F:System.ComponentModel.BrowsableAttribute.Yes"/>. This static field is read-only.
    /// </summary>
    public static readonly AdminBrowsableAttribute Default = AdminBrowsableAttribute.Yes;
    private bool browsable = true;

    /// <summary>
    /// Gets a value indicating whether an object is browsable.
    /// </summary>
    /// 
    /// <returns>
    /// true if the object is browsable; otherwise, false.
    /// </returns>
    public bool Browsable
    {
        get
        {
            return this.browsable;
        }
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="T:System.ComponentModel.BrowsableAttribute"/> class.
    /// </summary>
    /// <param name="browsable">true if a property or event can be modified at design time; otherwise, false. The default is true. </param>
    public AdminBrowsableAttribute(bool browsable)
    {
        if (!AppContext.IsAdmin)
        {
            this.browsable = browsable;
        }
    }

    /// <summary>
    /// Indicates whether this instance and a specified object are equal.
    /// </summary>
    /// 
    /// <returns>
    /// true if <paramref name="obj"/> is equal to this instance; otherwise, false.
    /// </returns>
    /// <param name="obj">Another object to compare to. </param>
    public override bool Equals(object obj)
    {
        if (obj == this)
            return true;
        AdminBrowsableAttribute browsableAttribute = obj as AdminBrowsableAttribute;
        if (browsableAttribute != null)
            return browsableAttribute.Browsable == this.browsable;
        return false;
    }

    /// <summary>
    /// Returns the hash code for this instance.
    /// </summary>
    /// 
    /// <returns>
    /// A 32-bit signed integer hash code.
    /// </returns>
    public override int GetHashCode()
    {
        return this.browsable.GetHashCode();
    }

    /// <summary>
    /// Determines if this attribute is the default.
    /// </summary>
    /// 
    /// <returns>
    /// true if the attribute is the default value for this attribute class; otherwise, false.
    /// </returns>
    public override bool IsDefaultAttribute()
    {
        return this.Equals((object)AdminBrowsableAttribute.Default);
    }
}
public AdminBrowsableAttribute(bool browsable)
{
    if (AppContext.UserCode != "Admin")
    {
        this.browsable = browsable;
    }
}