Reputation: 8211
I Have some classes in my project, some properties are Browsable(false)
so the user couldn't see them:
public class OrderEntity{
public int Id { get; set;}
[Browsable(false)]
public int ProductId { get; set;}
....
}
I want to, if the end-user is Admin, he can see the ProductId
, but another user can not see it.
So I need something like this:
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
}
Upvotes: 1
Views: 487
Reputation: 8211
I defined my own AdminBrowsable
class using Browsable
class code:
[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);
}
}
I only changed the Constructor
:
public AdminBrowsableAttribute(bool browsable)
{
if (AppContext.UserCode != "Admin")
{
this.browsable = browsable;
}
}
Upvotes: 0
Reputation: 1064114
This isn't something you can do via attributes, since BrowsableAttribute
is sealed
. To do this via bindings, you'd need a custom type descriptor - so you'd need to implement ICustomTypeDescriptor
on your type (directly or viaTypeDescriptionProvider
), provide a custom PropertyDescriptor
, and change how browsability is defined there (IsBrowsable
, IIRC).
Which is a ton of work.
Frankly, in almost all cases it would be better to just take manual control of the bindings, and only add the column / input / whatever after you've checked the security level.
Upvotes: 1