2

我希望提供Person如下定义的vCard从我的系统中打印 a 的能力。为了向用户提供隐私选项,用户可以选择是否显示/隐藏某些属性。在最简单的形式中,我需要一个单独的表格来保存用户的选择。

我想知道是否可以configurator table使用反射来构建它。如下面的Person模型所示,我可以使用自定义属性装饰属性,然后使用这些属性,构造并持久化一个模型,该模型将为bool每个装饰属性提供一个Person属性。

public class Person
{
    public string UserName { get; set; }
    public string FirstName { get; set; }

    [DisplayOnVCard]
    public string LastName { get; set; }

    [DisplayOnVCard]
    public string Email { get; set; }

    [DisplayOnVCard]
    public string MobilePhone { get; set; }
}

**[DisplayOnVCard]自定义属性在哪里。*

最后,我希望数据库中的一个表与此相对应:

public class VCardConfigurator
{
    public bool LastName { get; set; }
    public bool Email { get; set; }
    public bool MobilePhone { get; set; }
}

这只是一个实际巨大实体的示例表示。这就是为什么我希望避免手动将 bool 字段映射到每个可选属性。

我相信这个问题域与社交网站上隐私设置的工作方式非常相似,是吗?

在我输入此内容时,我确实考虑过如果我要从其中一个属性中删除该属性的可能性,这可能会产生什么影响。需要一些思考!

自我延伸阅读:


我很有可能会走上完全错误的道路!如果是这种情况,请指教!

4

1 回答 1

1

#1 更新

我不确定是否可以为实例添加或删除属性,因为属性处于类级别,但它们的属性值可以更改(因为它们是实例)。

我建议的解决方案

我不确定您在“我希望数据库中有一个与此相对应的表”中的意思,因为您不能在数据库中拥有一个只包含每个用户的非隐私属性列的表。

您将需要一个用于此映射的专用表(可以说是“PrivacyMappings”表),其中包含以下列:UserId、PropertyName、IsPrivate。

添加用户时,所有属性都将添加到此表中,并具有默认的隐私设置(例如,默认情况下所有属性都是非私有的)。您可以通过迭代它们来添加属性并按照您所说的插入它们。

您可以在实体框架中使用以下类:

public class PrivacyMapping
{
public int UserId {get;set;}
public string PropertyName {get;set;}
public bool IsPrivate {get;set;}
}

添加用户时添加默认隐私设置:

// retrieve user model properties.

foreach (property in properties)
{
//iterrate over the user Properties.
context.PrivacyMapping.Add(new PrivacyMapping(user.userId, propertyName, isPrivate);
}

context.SaveChanges()

现在您可以通过以下方式获取所有用户非私有属性

context.PrivacyMapping.Where(p=>p.UserId == user.id && !IsPrivate).Select(p=>p.PropertyName);

现在,您可以以任何方式处理信息。

例如,您可以有一个 VCardItems 类,它在其 c'tor 中接收用户 ID/对象,并按名称存储允许属性的字典。

public class VCardItems{

private Dictionary<string, object> properties{get;set;}

public VCardItems(User user)
{
// initiate values..
}
        public object this[string name] {
            get 
            { 
                if (properties.ContainsKey(name))
                {
                    return properties[name];
                }

                // A private property.
                return null;

            }
            set 
            {
                properties[name] = value;
            }
        }
    }

还有其他如何使用数据的选项,例如 ActionFilter 在这种情况下将私有属性设置为 null 或将非私有数据存储在 HttpContext.Items 字典中,但这完全取决于您。

第一条消息

在我们详细介绍之前,我想知道您希望如何使用这个类。

例如,如果一个视图(或任何处理它的东西),将要接收有一个运行时生成的类,你将如何处理它?

你怎么知道这个模型有什么属性?

于 2012-09-27T16:11:35.153 回答