我正在尝试制作微小的辅助方法以简化常规操作
但是在样本上:
public static int getEntityId<Type, Entity>(String name) where Entity: class
{
Type type = _db.GetTable<Entity>().SingleOrDefault(t => t.name == name);
return 0;
}
我得到错误:
Error 1 'Entity' does not contain a definition for 'name' and no extension method 'name' accepting a first argument of type 'Entity' could be found (are you missing a using directive or an assembly reference?) c:\work\asutp_migration\asutp_migration\Program.cs 89 62 asutp_migration
实际上,这是预期的错误,但是如何解决呢?
我将使用此方法使用的所有表/类均具有“名称”字段/属性。
UPD 1:
根据我的建议:
public partial class unit : IHasName
{
}
interface IHasName
{
string name { get; }
int id { get; }
}
public static int getEntityId<Type, Entity>(String name) where Entity: class, IHasName
{
Type type = _db.GetTable<Entity>().SingleOrDefault(t => t.name == name);
return (type == null) ? type.id : 0;
}
和代码:
int i = getEntityId<unit>("м");
Console.WriteLine(i);
我得到例外:
Unhandled Exception: System.NotSupportedException: The mapping of interface member IHasName.name is not supported.
UPD 2:
http://connect.microsoft.com/VisualStudio/feedback/details/344903/linq-to-sql-mapping-interface-member-not-supported-exception
我不敢相信。与我的问题有关吗?
UPD 3:
是的,似乎是VS问题:http://social.msdn.microsoft.com/Forums/en/linqtosql/thread/bc2fbbce-eb63-4735-9b2d-26b4ab8fe589
UPD 4:
public static int getEntityId<Type>(String name) where Type: class, IHasName
{
Type type = _db.GetTable<Type>().SingleOrDefault(t => t.name.Equals(name));
return (type != null) ? type.id : 0;
}
所以这是一个解决方案,谢谢大家:-)
最佳答案
好了,您将需要创建一个通用约束,该约束指定比class
更具体的内容。例如,如果您说where Entity : IHasName
和IHasName
定义了属性name
,那么您将被全部设置。