C# 类型为T的通用接口,其中

C# 类型为T的通用接口,其中,c#,generics,C#,Generics,我尝试进入通用接口的第一步,并拥有以下接口: public interface ISetting<T> { T Value { get; } } 公共接口设置 { T值{get;} } 以及这样的实现: public class MySetting : ISetting<DateTime> { DateTime Value { get; } } 公共类MySetting:ISetting { 日期时间值{get;} } 现在我的目标是,我可以

我尝试进入通用接口的第一步,并拥有以下接口:

public interface ISetting<T>
{
    T Value { get; }
}
公共接口设置
{
T值{get;}
}
以及这样的实现:

public class MySetting : ISetting<DateTime> 
{ 
    DateTime Value { get; }
}
公共类MySetting:ISetting
{ 
日期时间值{get;}
}
现在我的目标是,我可以在我的服务层中这样编写代码:

public class MyService
{
    public DateTime GetMySetting()
    {
        return MyDataLayer.GetSettings<MySetting>();
    }
}
公共类MyService
{
公共日期时间GetMySetting()
{
返回MyDataLayer.GetSettings();
}
}
因此,在我的数据层中,我正在努力实现我的泛型,在哪里:

public T ReadOrAddOne<T>() where T : ISetting<????>
{
    // My Code goes here
}
public T ReadOrAddOne(),其中T:ISetting
{
//我的密码在这里
}

那么如何告诉我的ISetting我正在等待哪种类型呢?

您只需要定义另一个字母来表示该类型

public T ReadOrAddOne<T,R>() where T : ISetting<R>
{
    return default(T);
}
public T ReadOrAddOne(),其中T:ISetting
{
返回默认值(T);
}

是否应该是
其中R:ISetting
?是的,我已经准备好了,但是我的调用代码不是return MyDataLayer.GetSettings();if将返回MyDataLayer.GetSettings();对吗?@Kovu的确如此。编译器无法找出您的类可能实现的许多
ISettings
中的哪一个作为结果选择-因此您需要两个参数-实现接口的实际类和接口本身…@Kovu您的意思是它们都具有相同的类型?@AlexeiLevenkov:谢谢,我只是想避免这样的情况=/你希望在这里看到什么样的代码”//我的代码在这里”-你不能仅仅根据键入的内容更新
ISetting
。。。那么您的
ReadOrAddOne
将如何实现这一点呢?(这可能会打开更多的选项-现在只有
ReadOrAddOne
是合理的,如Rawitas Krungkaew的回答所示)是的,我可以:)我准备好了,当我像我设置的一样,新建(),因此,我可以创建一个新实例,但您不能用一个参数定义两种类型-因此,如果您坚持使用一个类型参数,您要么不知道
值的返回类型
,要么不知道
设置的具体类型
。。。