我想将一些实体ID更改为强类型。为了避免过多的代码重构,我使用了隐式转换。使用泛型类的强类型ID
这是我到目前为止有:
public class FooBarId
{
private readonly Guid _id;
public FooBarId(Guid id)
{
_id = id;
}
public Guid Id
{
get { return _id; }
}
public static implicit operator Guid(FooBarId id)
{
return id.Id;
}
public static implicit operator FooBarId(Guid id)
{
return new FooBarId(id);
}
}
此代码工作正常,我没有改变任何东西在我的代码。
但我想创造更多这样的类,并且为了避免重复自己,我创建了一个通用类:
public class CustomId<T>
{
private readonly T _id;
public CustomId(T id)
{
_id = id;
}
public T Id
{
get { return _id; }
}
public static implicit operator T(CustomId<T> id)
{
return id.Id;
}
public static implicit operator CustomId<T>(T id)
{
return new CustomId<T>(id);
}
}
并试图继承它在我的FooBarId
类:
public class FooBarId : CustomId<Guid>
{
}
然后我的代码打破了使用FooBarId的例外:
Argument type 'System.Guid' is not assignable to parameter type 'FooBarId'
。
当我尝试投它这样foo.bar((FooBarId)new Guid())
- 代码编译,但在程序执行后会抛出一个异常:
<System.InvalidCastException> (Unable to cast object of type 'CustomId1[System.Guid]' to type 'FooBarId'.)
缺少什么我在这里?
你使用什么代码来获得使用FooBarId的异常_? – Trisped
@Trisped我调用了一些命令方法,它接受FooBarId作为参数:'foo.bar((FooBarId)new Guid())' – Andrew