C# 带有where约束或类似内容的操作

C# 带有where约束或类似内容的操作,c#,generics,constraints,C#,Generics,Constraints,我有一个类型化的数据类“要保存的数据”,有多个接口, 另一个dll“数据库”,用于处理保存和约束数据,以便进行适当的操作。 我有另一个dll“different_dll_,但不包含\u referece_to_db”,它生成数据,需要保存数据,但无法访问或创建数据库dll的实例 传入一个动作或Func,甚至一个接口实例都可以, “不带\u referece\u to \u db的不同\u dll”dll大致需要调用database.save 下面是我能想到的最好的方法,但是save函数显然要求数

我有一个类型化的数据类“要保存的数据”,有多个接口, 另一个dll“数据库”,用于处理保存和约束数据,以便进行适当的操作。 我有另一个dll“different_dll_,但不包含\u referece_to_db”,它生成数据,需要保存数据,但无法访问或创建数据库dll的实例

传入一个动作或Func,甚至一个接口实例都可以, “不带\u referece\u to \u db的不同\u dll”dll大致需要调用database.save

下面是我能想到的最好的方法,但是save函数显然要求数据是两个接口的数据,因此接口i_save_data只匹配其中一个接口

我走错方向了吗? 有没有更简单的方法

 public class data_to_save : i_data_stuff, i_useful_stuff
    {

    }
    public class database
    {
        private object dbinstance;
        public bool save<T>(T data, bool sometimes_required = false, object otherdata = null)
            where T : i_data_stuff, i_useful_stuff
        {
            try
            {
                //dbinstance.save(data);
                return true;
            }
            catch
            {
                // log and such
            }
            return false;

        }
    }

    public class different_dll_without_referece_to_db : i_save_data
    {
        public Action<i_data_stuff> saveitem { get; set; }
        public bool generate_stuff()
        {
            try
            {
                var to_save = new data_to_save();
                saveitem?.Invoke(to_save);
            }
            catch (Exception ex)
            {
                // log or whatever
                return false;
            }
            return true;
        }
    }

    public interface i_save_data
    {
        Action<i_data_stuff> saveitem { get; set; }
    }

    public class main_instance_with_reference_to_both
    {
        public database db = new database();
        public different_dll_without_referece_to_db outside = new different_dll_without_referece_to_db();

        public void generate_my_data()
        {
            outside.saveitem = (data) =>
            {
                db.save(data, true);
            };
            outside.generate_stuff();
        }
    }
要保存的公共类数据:i_数据,i_有用的东西
{
}
公共类数据库
{
私有对象实例;
public bool save(T data,bool有时需要=false,object otherdata=null)
其中T:i\u数据\u东西,i\u有用的东西
{
尝试
{
//保存(数据);
返回true;
}
抓住
{
//日志之类的
}
返回false;
}
}
公共类不同的\u dll\u没有\u引用\u到\u数据库:i\u保存\u数据
{
公共操作保存项{get;set;}
公共布尔生成_stuff()
{
尝试
{
var to_save=新数据to_save();
saveitem?.Invoke(保存);
}
捕获(例外情况除外)
{
//日志之类的
返回false;
}
返回true;
}
}
公共接口i_保存数据
{
操作保存项{get;set;}
}
公共类主\u实例\u与\u引用\u到\u两者
{
公共数据库db=新数据库();
public different_dll_without_referece_to_db outside=new different_dll_without_referece_to_db();
public void生成我的数据()
{
outside.saveitem=(数据)=>
{
db.save(数据,真);
};
outside.generate_stuff();
}
}