long
タイプまたはのいずれかのパブリック プロパティを作成しようとしていますGuid
。ジェネリックで可能ですか?たとえば、次のようなもの
public virtual T where T: long or Gui Id { get; set; }
ジェネリックで可能ですか?
これは不可能ですが、 use を使用してとのimplicit operator
両方をサポートすることで回避できます。サンプル コードは次のとおりです。long
Guid
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;
いいえ、これは不可能です。考えられる型が 2 つしかない場合は、クラスを 2 回記述して、共通の基本クラスにできるだけ多くの共通コードを配置しますか?
いいえ、それは不可能です。そのような制約はありません。可能な制約のリストを次に示します。
いいえ、これは不可能です。同じ親クラスを選択するか、両方を格納できるクラスの独自の実装を作成する必要があります。
何かのようなもの:
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;
}
}
}
プロパティをそのように汎用にすることはできません。代わりに、プロパティを含むクラスをジェネリックにすることができますか?
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; }
}