您好我想写一个看起来像这样的模型:
public class Profile : Models.Users {
ModdDBEntities db = new ModdDBEntities();
public Profile( int user_id ) {
this = (Profile)(
from u in db.Users.Where(r => r.user_id == user_id )
select u
).First();
}
}
是否有任何方法可以为此分配每个属性的值?
答案 0 :(得分:1)
您可以创建工厂方法:
public static Profile ReadProfile()
{
var query = from u in db.Users.Where(r => r.user_id == user_id )
select u;
return query.First();
}
从不同的角度来看,这是更好的方式。首先,这不是一个普通的建筑。在普通的默认构造函数调用期间,您的Profile类的用户不能指望任何与数据库相关的操作,并且使用工厂方法更清晰地表示您的意图。其次,它简化了进一步的变化。例如,更优选的实现数据访问层(a.k.a.DAL)的方法是创建全新的类(或类集),这些类可以封装所有与数据库相关的操作。
例如,您可以创建单独的界面:
interface IProfileRepository
{
Profile ReadProfile();
}
然后创建具体的存储库:
class ProfileRepository : IProfileRepository
{
public Profile ReadProfile() { .. implementation skipped .. }
}
在这种情况下,您可以进一步分离逻辑。这允许您简单地“替换”您的真实类(如ProfileRepository)与返回“假”对象的“假”类。
这种技术称为“mocking”,它对于创建不使用任何外部资源(如数据库)的单元测试特别有用。
答案 1 :(得分:1)
如果您确实要将所有属性从一个对象复制到另一个对象,则可以执行以下操作:
foreach (var obj1Property in obj1.GetType().GetProperties())
{
var obj2Property = obj2.GetType().GetProperty(obj1Property.Name);
obj2Property.SetValue(obj2, obj1Property.GetValue(obj1, null), null);
}
在您的情况下,obj1
是个人资料对象,obj2
是this
。
这只复制公共属性,当然,不会检查以确保obj2的类型声明obj1类型中找到的所有属性。它也不会检查两种类型中的同名属性本身是否属于同一类型。但它应该让你开始。
除非是非常特殊的情况,否则我不建议这样做。
答案 2 :(得分:0)
你不能为此设置任何东西(自我)。您只能在对象中设置字段的属性,而不能设置实例。
使您的方法保持静态并从方法
返回配置文件对象public static Profile GetProfile( int user_id ) {
var prof = (Profile)(
from u in db.Users.Where(r => r.user_id == user_id )
select u
).First();
return prof
}
或写入方法来复制所有属性。您可以使用反射将配置文件的属性复制到此,而不提及字段名称。