簡體   English   中英

具有泛型類的強類型ID

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM