![](/img/trans.png)
[英]Is it possible to have strongly typed parameter constraints in a constructor of a generic class?
[英]Strongly typed IDs with generic class
我想將某些實體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'.)
我在這里想念什么?
這對我有用:
class Program
{
static void Main(string[] args)
{
Guid result1 = (CustomId<Guid>)new CustomId<Guid>(Guid.NewGuid());
Guid result2 = (CustomId<Guid>)new FooBarId();
Guid result3 = (FooBarId)new FooBarId();
Guid result4 = new FooBarId();
CustomId<Guid> cIResult = Guid.NewGuid();
}
}
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);
}
}
public class FooBarId : CustomId<Guid>
{
public FooBarId()
: base(Guid.NewGuid())
{
}
}
您不能執行(FooBarId)new Guid()
因為CustomId<Guid>
不是FooBarId
。 您將需要為從Guid
轉換為該類的每個類定義一個隱式運算符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.