3

我在一个名为的类中有一个变量Id

public class myClass
{
    GUID Id;
}

如何对Id变量进行多态性以获取 int 类型或 GUID 类型?

我想要这样的东西,但它只获得 GUID 或 int:

编辑:

public class myClass
{
    Guid || int Id;
}

我想要它以便在类的初始化时定义 int 或 Guid。

4

5 回答 5

5

您可以使该类通用:

public class MyThing<T>
  where T : struct
{
  public T MyProperty { get; set; }
}

然后可以通过以下方式使用它:

MyThing<GUID>
MyThing<int>

但是为了给你一个有效的答案,了解你想要达到的目标肯定会有所帮助。

于 2013-06-05T09:05:19.027 回答
3

您可以使用泛型类。

public class MyClassName<TId>
{
  public TId Id { get; set; }
}

并像这样使用它:

对于整数:

var myObject = new MyClassName<int>();

对于指南:

var myObject = new MyClassName<Guid>();
于 2013-06-05T09:05:47.000 回答
0

在这种情况下你不能这样做,因为多态性与对象继承有关

多态性是对象根据其使用方式更改其公共接口的能力。使用继承时,当派生类的对象被替换为期望其父类的实例时,就实现了多态性。这使用称为向上转换的过程。通过向上转换,更专业的类的对象被隐式转换为所需的基类类型。

更多信息在这里

于 2013-06-05T09:11:53.660 回答
0

您想要的是unionC的一个或F#中的可区分联合类型;两者都不可能在C#中以良好的语法定义。

此代码为您提供了在类似场景中使用的通用类:

public class Either<A, B>
{
    A _a;
    B _b;
    bool _isLeft;

    private Either() { }
    private Either(A a, B b, bool isLeft)
    {
        _isLeft = isLeft;

        if (_isLeft)
        {
            _a = a;
            return;
        }

        _b = b;
    }
    public Either(A a) : this(a, default(B), true) { }
    public Either(B b) : this(default(A), b, false) { }

    public A Left { get { return _a; } }
    public B Right { get { return _b; } }
    public bool HasLeft { get { return _isLeft; } }
}

您需要检查HasLeft以查看实际存在的值。可以只使用一个对象字段和一些我更喜欢在静态类型语言中避免的转换。还有其他可能的解决方案(使用dynamicor struct),但这个(恕我直言)会做。

注意:另一种方法是case classbase class. 坏事(再次恕我直言)是你必须为每个case class.

于 2013-06-05T11:39:15.223 回答
0

我不确定你为什么要这样做,但如果你必须这样做,如何:

public class
{
    object Id;
}

或者

public class
{
   private int _intId;
   private GUID _guidId;

   public int GetIntegerGuid()
   { 
       return _intId;
   }

   public int GetGuid()
   { 
       return _guidId;
   }
}
于 2013-06-05T09:04:08.167 回答