view datagear/dg/DataGear.cs @ 8:e6f5b7d14dd1

update DataGears
author riono <e165729@ie.u-ryukyu.ac.jp>
date Mon, 12 Oct 2020 00:49:32 +0900
parents f27db91a852e
children ce6906edcbf4
line wrap: on
line source

using System;

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

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

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

    public void SetData(T data) {
        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 T GetData() {
        return data;
    }

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