view datagear/dg/DataGear.cs @ 34:1236da135f79

update
author riono <e165729@ie.u-ryukyu.ac.jp>
date Tue, 27 Apr 2021 22:57:14 +0900
parents 96fc5e71274e
children 090be804eaa9
line wrap: on
line source

using System;

namespace Christie_net.datagear.dg {
public class DataGear<T> {
    protected T data;
    protected Type clazz = null;

    public DataGear(T data) {
        SetClazz(data.GetType());
        SetData(data);
    }

    public DataGear(Type clazz) {
        SetClazz(clazz);
    }

    public void SetData(T data) {
        //Console.WriteLine("data ****" + data.GetType() + "  clazz;" + clazz);
        var dataClazz = data.GetType();
        if (dataClazz == clazz) {
            this.data = data;
            return;
        }

        var dataSuperClazz = dataClazz.BaseType;
        while (dataSuperClazz != null) {
            if (dataClazz == clazz) {
                this.data = data;
                return;
            }

            dataSuperClazz = dataSuperClazz.BaseType;
        }

        var interfaces = dataClazz.GetInterfaces();
        foreach (var interfaze in interfaces)
            if (interfaze == clazz) {
                this.data = data;
                return;
            }

        throw new InvalidCastException("datagear cannot set class from " + dataClazz.GetType().Name + " to " +
                                       data.GetType().Name);
    }

    public void SetClazz(Type clazz) {
        this.clazz = clazz;
    }

    public Type GetClazz() {
        return clazz;
    }

    public virtual T GetData() {
        return data;
    }

    public override string ToString() {
        return "DataGear : classname " + clazz;
    }
}
}