1

longタイプまたはのいずれかのパブリック プロパティを作成しようとしていますGuid。ジェネリックで可能ですか?たとえば、次のようなもの

public virtual T where T: long or Gui Id { get; set; }
4

5 に答える 5

4

ジェネリックで可能ですか?

これは不可能ですが、 use を使用してとのimplicit operator両方をサポートすることで回避できます。サンプル コードは次のとおりです。longGuid

internal class YourId
{
    public long LongId { get; private set; }
     public Guid GuidId { get; private set; }

    public YourId(long longValue)
    {
        LongId = longValue;
    }

    public YourId(Guid guidValue)
    {
        GuidId = guidValue;
    }

    public static implicit operator long(YourId yourId)
    {
        return yourId.LongId;
    }

    public static  implicit operator YourId(long value)
    {
        return new YourId(value);
    }

       public static implicit operator Guid(YourId yourId)
    {
        return yourId.GuidId;
    }

    public static  implicit operator YourId(Guid value)
    {
        return new YourId(value);
    }
}

これで、次を使用できます。

YourId id1 = Guid.NewGuid();
YourId id2 = long.MaxValue;
于 2012-09-20T09:23:14.993 に答える
1

いいえ、これは不可能です。考えられる型が 2 つしかない場合は、クラスを 2 回記述して、共通の基本クラスにできるだけ多くの共通コードを配置しますか?

于 2012-09-20T09:10:35.667 に答える
1

いいえ、それは不可能です。そのような制約はありません。可能な制約のリストを次に示します。

于 2012-09-20T09:10:38.950 に答える
1

いいえ、これは不可能です。同じ親クラスを選択するか、両方を格納できるクラスの独自の実装を作成する必要があります。

何かのようなもの:

class LongOrGuid
{
     private Guid _guid;
     private long _long;
     private bool _isGuid = true;

     public LongOrGuid(Guid g)
     {
          _guid = g;
          _isGuid = true;
     }

     public LongOrGuid(long l)
     {
          _long = l;
          _isGuid = false;
     }

     public long Long
     {
          get
          {
               if(_isGuid)
               {
                    throw new NotSupportedException("This is a guid");
               }
               return _long;
          }
     }

     public Guid Guid
     {
          get
          {
               if(!_isGuid)
               {
                    throw new NotSupportedException("This is a long");
               }
               return _guid;
          }
     }

     public bool IsGuid
     {
          get
          {
               return _isGuid;
          }
     }
}
于 2012-09-20T09:10:39.607 に答える
1

プロパティをそのように汎用にすることはできません。代わりに、プロパティを含むクラスをジェネリックにすることができますか?

longまたはに制限することはできませんGuid。あなたは言えた:

class ClassContainingYourProperty<T> where T : struct, IFormattable, IComparable<T>, IEquatable<T>
{
  static ClassContainingYourProperty() // do type check in static constructor
  {
    var t = typeof(T);
    if (t != typeof(long) && t != typeof(Guid))
      throw new NotSupportedException("T cannot be " + t);
  }

  public virtual T YourProperty { get; set; }
}
于 2012-09-20T09:37:01.373 に答える