我正在尝试制作微小的辅助方法以简化常规操作
但是在样本上:

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 : IHasNameIHasName定义了属性name,那么您将被全部设置。

09-13 13:52