gpt4 book ai didi

c# - SqlTableProfileProvider,自定义ProfileBase类,给properties添加额外的属性

转载 作者:行者123 更新时间:2023-11-30 18:41:40 25 4
gpt4 key购买 nike

我使用 SqlTableProfileProvider 作为我的配置文件提供程序和一个名为“ProfileCommon”的自定义类,它继承自 System.Web.Profile.ProfileBase。我的 ProfileCommon 类属性表示我的配置文件表中的列,每个属性都获得 [CustomProviderData("columnName;dbType")] 的属性。我正在尝试向特定列添加一个新属性,然后我将从 SqlTableProfileProvider 类中提取该信息。

我和团队希望将外键(表)与我们的 Profile 表相关联。现在,我们的 Profile 表基本上存储键值对,FirstName、LastName、Age 等;但是,我们计划存储书签、指向最喜欢的文章的链接等等,它们将显示在我们的仪表板页面上的列表中。我们喜欢使用 SqlTableProfileProvider 和我创建的 ProfileCommon 对象。我们所有的 asp.net 页面都继承自 BasePage,一个名为 Profile 的属性获取配置文件公共(public)对象。

如果能够做到:

Profile.Bookmarks.Count; // to know if there are bookmarks

// to also just be able to foreach through them
foreach (Bookmark bk in Profile.Bookmarks) { ... }

例如:

public class ProfileCommon : System.Web.Profile.ProfileBase
{
public static ProfileCommon GetProfile() { .... }

[CustomProviderData("FirstName;varchar")]
public virtual string FirstName
{
get
{
return ((string)(this.GetPropertyValue("FirstName")));
}
set
{
this.SetPropertyValue("FirstName", value);
}
}

[CustomProviderData("LastName;varchar")]
public virtual string LastName
{
get
{
return ((string)(this.GetPropertyValue("LastName")));
}
set
{
this.SetPropertyValue("LastName", value);
}
}

[CustomProviderData("OtherColumn;int")]
[TableNameData("OtherTable")]
public virtual int OtherColumn
{
get ...
set ...
}
}

// My new attribute
[AttributeUsage(AttributeTargets.Property)]
public class TableNameData : Attribute
{
private string _tableName;

public TableNameData(string tableName)
{
_tableName = tableName;
}

public string TableName
{
get
{
return _tableName;
}
}
}

// Not my implementation, but looking to enhance it.
public class SqlTableProfileProvider : ProfileProvider
{
public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, SettingsPropertyValueCollection svc, string username, SqlConnection conn)
{
...
foreach (SettingsProperty prop in properties)
{
...
// in here, gets CustomProviderData
string persistenceData = prop.Attributes["CustomProviderData"] as string.

// how do i get to mine?
}
}
}

SqlTableProfileProvider 是由 Hao Kung 实现的。它继承自 ProfileProvider。

GetPropertyValues 方法之一返回一个 SettingsPropertyValueCollection。有一个名为 GetProfileDataFromTable 的私有(private)方法。在那里,我希望访问我创建的自定义属性。

问题:如何访问我在属性上指定的属性?

更新:07162011:1517,提问后 7 天,

我确实找到了一种方法来做到这一点。以下是我是如何做到的:

// In the default constructor add the following
public ProfileCommon()
{
// Get all properties for this class 'ProfileCommon'
PropertyInfo[] propertyInfos = typeof(ProfileCommon).GetProperties();

// The ProfileBase, base class, has a property called Properties and
// one can get to all attributes on that property but there are only
// a few attributes that ProfileBase looks for. If the developer wishes
// to use custom attributes on a property, it wont appear in the
// ProfileCommon.Properties.Attributes list.
//
// So, what are we going to do, well, we are going to come up with a hack and solution to this problem
//
foreach (SettingsProperty settingsProperty in ProfileCommon.Properties)
{
foreach (PropertyInfo propertyInfo in propertyInfos)
{
if (settingsProperty.Name == propertyInfo.Name)
{
// get all attributes from the associated property, but we are getting it from the propertyInfo variable
// which was retrieved through reflection and will list ALL attributes.
object[] attributes = propertyInfo.GetCustomAttributes(false);

for (int i = 0; i < attributes.Count(); i++)
{
Type type = attributes[i].GetType();

PropertyInfo[] attributeClassProperities = type.GetProperties();

foreach (PropertyInfo attributeClassProperty in attributeClassProperities)
{
// not intested in the TypeId property for the object
if (!attributeClassProperty.Name.Equals("TypeId"))
{
// if the settingsProperty.Attributes does not contain our key value pair, then add it.
if (settingsProperty.Attributes[attributeClassProperty.Name] == null)
{
settingsProperty.Attributes.Add(attributeClassProperty.Name, attributes[i]);
}
}
}
}
}
}
}
}

最佳答案

您只需按照示例中的方式实现 ProfileCommon,并确保属性正确。

对于专门的配置文件属性书签,您还可以编写自己的配置文件类,就像您在示例中所做的那样。在那里,您必须实现一个 Count 属性,该属性将在数据库中查询该用户的书签数量。

在数据库的 Profile 表中,您将有一个 Bookmarks 列,该列具有合适的 FK 类型,例如 Guid、Int 或 BigInt,它只不过是另一个您可以命名为 [dbo] 的表的外键。[Bookmarks]这实际上包含每个用户的书签。这个 Bookmarks 表应该有一个像 UserId 这样的列,它是 ASP.NET UserId 的 FK。

关于c# - SqlTableProfileProvider,自定义ProfileBase类,给properties添加额外的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6637153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com