我想將一些實體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