5

我有一个带有一堆属性的用户对象。我有一个要求,即当用户设置他们的信息时,他们需要能够说明他们的个人资料的哪些属性对其他人可见。

我设想的方式是添加一个额外的属性 - 一个字符串列表,其中包含公开可见的属性名称。然后我可以实现一个名为 ToPublicView() 的方法或类似的方法,使用反射将非公共属性设置为 null 或默认值。

这是一种合理的方法,还是有更好的方法?

4

4 回答 4

1

我认为这是最简单的选项。如果反射开始影响你的表现,你可能需要一个属性委托字典来访问这些值。

而且由于要求不是具有动态属性,而只是标记现有属性,因此以动态方式拥有所有属性(如属性对象列表)是没有意义的。此外,当您必须将它们用于应用程序的其余部分时,将它们作为实际属性将使代码更具可读性。

于 2012-05-31T13:46:53.947 回答
1

在这种情况下,如果可能的话,我建议您简单地列出您的属性,例如:

public Class Property<T>
{
    public Property(string name, bool visible, T value)
    {
        Name = name;
        Visible = visible;
        Value = value;
    }

    string Name { get; set; }
    bool Visible { get; set; }
    T Value { get; set; }
}

然后你可以像这样创建一个属性列表:

List<Property> properties = new List<Property>();
properties.Add(new Property<string>("FirstName", true, "Steve"));

如果您今天需要能够设置可见性,那么明天您可能还需要设置其他元属性。颜色?必需/可选?尺寸?等等。拥有自己的属性类型可以让您在未来轻松扩展它。

于 2012-05-30T15:31:37.037 回答
0

可以使用,可能是自定义DynamicObject实现的某种组合

编辑

  //custom property class
  public class MyProperty
  {
      public bool IsVisible { get; set; }
      public string PropertyName { get; set; }
  }

  public class Dymo: DynamicObject
  {

      Dictionary<MyProperty, object> dictionary
          = new Dictionary<MyProperty, object>();

      public override bool TryGetMember(
          GetMemberBinder binder, out object result)
      {
          result = false;
          var prop = PropertyFromName(binder.Name);
          if (prop != null && prop.IsVisible)
              return dictionary.TryGetValue(prop, out result);

          return false;

      }

      public override bool TrySetMember(
          SetMemberBinder binder, object value)
      {

          var prop = PropertyFromName(binder.Name);
          if (prop != null && prop.IsVisible)
              dictionary[prop] = value;
          else
              dictionary[new MyProperty { IsVisible = true, PropertyName = binder.Name}] = value;
          return true;
      }

      private MyProperty PropertyFromName(string name)
      {
          return (from key in dictionary.Keys where key.PropertyName.Equals(name) select key).SingleOrDefault<MyProperty>();
      }


      public void SetPropertyVisibility(string propertyName, bool visibility)
      {
          var prop = PropertyFromName(propertyName);
          if (prop != null)
              prop.IsVisible = visibility;         
      }
  }

并在这样之后使用它。

dynamic dynObj = new Dymo();
dynObj.Cartoon= "Mickey" ;
dynObj.SetPropertyVisibility("Mickey", false); //MAKE A PROPERTY "INVISIBLE"
于 2012-05-30T15:41:22.943 回答
0

什么?不。如果这是需求,那么用户属性应该用实际属性来实现,而是使用某种 IEnumerable 和 Property 对象,其中每个 Property 都有其可见性等。

于 2012-05-30T15:31:40.643 回答