您可以创建一个对象并将其存储在配置文件中。例如:
[Serializable]
public class ProfileObject { }
[Serializable]
class StudentProfile : ProfileObject
{
public string Year {get;set;}
public string Name {get;set;}
public string Age {get;set;}
}
[Serializable]
class TeacherProfile : ProfileObject
{
public string Department {get;set;}
public string Tenure {get;set;}
public string Rating {get;set;}
}
在 web.config 中:
<profile>
...
<properties>
<add name="UserProfile" allowAnonymous="false" type="ProfileObject" serializeAs="Xml"/>
</properties>
</profile>
编辑:我不记得你是否可以使用接口作为类型。将其更改为对象。
通过 Profile.UserProfile 访问它(冗余,但它有效)。然后,要处理这个,你必须检查类型:
if(Profile.UserProfile is StudentProfile) { /* do something */ } else
if(Profile.UserProfile is TeacherProfile) { /* do something */ } // etc.
您还可以将泛型存储在配置文件对象中(也许是字典?以下是我使用过的实现)
例如:
namespace Model
{
[Serializable]
public class RecentlyViewed : List<Model.Product>
{
public RecentlyViewed() {}
}
}
在 web.config 中:
<profile>
...
<properties>
<add name="RecentlyViewed" allowAnonymous="false" type="Model.RecentlyViewed" serializeAs="Xml"/>
</properties>
</profile>
我在 .NET 3.5 中使用了这种方法,我不确定它是否适用于 .NET 2 或 3。我假设泛型的处理方式相同,因为编译器没有改变。
注意:有必要将通用对象继承为空对象,因为配置文件设置不喜欢以下内容:
<profile>
...
<properties>
<add name="RecentlyViewed" allowAnonymous="false" type="System.Collections.Generic.List`1[Model.Product]" serializeAs="Xml"/>
</properties>
</profile>
上面是完全限定的 IL 名称,因为它确实应该看起来。XML 似乎不喜欢刻度线。
我还没有研究过在 Profile 对象中存储序列化对象的任何性能问题,因此我不建议对您经常需要的任何属性使用此方法。