我前一段时间问过这个问题,但没有得到一个可用的答案.基本上,由于无效的强制转换异常,我无法获取复制对象的方法.但是我可以在复制方法之外把事情搞得很好.
这是复制方法
public static class ObjectDuplicator { public static T Clone<T>(T source) { if (!typeof(T).IsSerializable) { throw new ArgumentException("the Type must be serializable.","source"); } if (Object.ReferenceEquals(source,null)) //dont try to serialize a null object { return default(T); } IFormatter formatter = new BinaryFormatter(); Stream stream = new MemoryStream(); using (stream) { formatter.Serialize(stream,source); stream.Seek(0,SeekOrigin.Begin); return (T)formatter.Deserialize(stream); } } }
public void AddJob(Job job) { if (!Jobs.Contains(job)) { Job newcopy = Utilities.ObjectDuplicator.Clone<Job>(job); Jobs.Add(newcopy); } }
它抛出此异常:
system.invalidCastException was
unhandled Message=Unable to cast
object of type
‘KH.CharacterClasses.Freelancer’ to
type ‘KH.CharacterClasses.Job’
现在,我添加的作业类型是Job(自由职业者)的继承类,这两个类的代码如下
[Serializable] public class Job : Ability { protected JobCommand basecommand1; protected JobCommand basecommand2; protected JobCommand basecommand3; protected JobCommand basecommand4; protected JobCommand command1; protected JobCommand command2; protected JobCommand command3; protected JobCommand command4; bool mastered; protected FFJob job; protected string name; int level; public FFJob SetJob { get { return job; } } public bool Mastered { get { return mastered; } } public JobCommand Command1 { get { return command1; } set { command1 = value; } } public JobCommand DefaultCommand1 { get { return basecommand1; } } public JobCommand Command2 { get { return command2; } set { command2 = value; } } public JobCommand DefaultCommand2 { get { return basecommand2; } } public JobCommand Command3 { get { return command3; } set { command3 = value; } } public JobCommand DefaultCommand3 { get { return basecommand3; } } public JobCommand Command4 { get { return command4; } set { command4 = value; } } public JobCommand DefaultCommand4 { get { return basecommand4; } } public Job(string name,string description,int jobID) : base(name,description,jobID,-1,null,-1) { } public static bool operator ==(Job job1,Job job2) { if (System.Object.ReferenceEquals(job1,job2)) return true; if (((object)job1 == null) || ((object)job2 == null)) return false; return (job1.Name == job2.Name && job1.UID == job2.UID); } public static bool operator !=(Job job1,Job job2) { return !(job1 == job2); } // public abstract void CharacterModifier(BaseCharacter character); // public abstract void CharacterDemodifier(BaseCharacter character); } [Serializable] public class Freelancer : Job { public Freelancer() : base("Freelancer","A character not specializing in any class. Can combine the power of all mastered Jobs.",Globals.JobID.ID) { basecommand1 = JobCommand.Attack; basecommand2 = JobCommand.Free; basecommand3 = JobCommand.Free; basecommand4 = JobCommand.Items; command1 = basecommand1; command2 = basecommand2; command3 = basecommand3; command4 = basecommand4; job = FFJob.Freelancer; } }
我真的不知道问题是什么.正如我所说的,在这种方法之外,cast的工作正常,我知道这段代码以前有用过.有任何想法吗?
谢谢
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。