[英]Is there a way to use an “Id”-property in a derived class when I have the BsonId-attribute for another property in the base type?
[英]Have property be the same type as property of another class
我可以拥有财产StudentId
类的StudentRegistered
是同一类型的Student.Id
(即byte
),就不能不提byte
在StudentRegistered
声明?
我想在我的应用程序中为每个派生类的Person
定义一次Id
类型。 我错过了什么?
public class Person<T>
{
public T Id { get; set; }
public string Name { get; set; }
}
public class Student : Person<byte> { }
public class Adult : Person<short> { }
public class StudentRegistered
{
public /* type */ StudentId { get; set; }
public int EventId { get; set; }
}
编辑,澄清:
Student
声明之外的任何地方提及Student.Id
的类型(即byte
)。 string Name
作为StudentRegistered
的属性。 StudentRegistered
没有Adult
。 StudentRegistered.StudentId
的byte
类型就足够了。 是的,你可以使它成为通用的并继承自Person<T>
public class StudentRegistered<T> : Person<T>
{
public T StudentId {get; set;};
public int EventId {get; set;};
}
没有就没有办法做你所要求的,因为StudentRegistered
将是两种不同的类型,一种以byte
为StudentId
和一个带有short
的StudentId
。
这里存在严重的设计问题,需要不同类型的公共ID。 您最好选择具有InnerID
方法的公共基本接口,然后将该接口与注册链接。
public interface IPerson
{
ValueType InnerID { get; }
}
public abstract class Person<T> : IPerson
where T : struct
{
public T ID { get; set; }
protected abstract ValueType InnerID { get; }
ValueType IPerson.InnerID { get { return InnerID; } }
}
public class Student : Person<byte>
{
protected override ValueType InnerID
{
get { return ID; }
}
}
public class Adult : Person<short>
{
protected override ValueType InnerID
{
get { return ID; }
}
}
public class StudentRegistered
{
public ValueType StudentID { get { return Person.InnerID; } }
public IPerson Person { get; set; }
public int EventId { get; set; }
}
class Program
{
static void Main(string[] args)
{
var A=new Student() { ID=100 }; // byte
var B=new Adult() { ID=1000 }; // short
var regA=new StudentRegistered() { Person=A };
Console.WriteLine("Type: {0} Value: {1}", regA.StudentID.GetType().Name, regA.StudentID);
// Type: Byte Value: 100
var regB=new StudentRegistered() { Person=B };
Console.WriteLine("Type: {0} Value: {1}", regB.StudentID.GetType().Name, regB.StudentID);
// Type: Int16 Value: 1000
}
}
你必须在某个地方使用泛型,你可以这样做:
public class StudentRegistered<TS, TId> where TS : Person<TId>
{
public TId StudentId {get; set;}
public int EventId {get; set;}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.