初始化泛型类型的属性

本文关键字:属性 泛型类型 初始化 | 更新日期: 2023-09-27 18:36:15

我已经阅读了多篇帖子,但没有找到适合我问题的答案。但必须有一个。因此,如果这篇文章真的是重复的,请耐心等待。

我尝试初始化实现泛型接口的泛型类型的属性。

我的界面基本上是这样的:

public interface IMyInterface<TType> : IMyInterface
{
    TType Value {get; set;}
    // ... and some more ...
}
public interface IMyInterface 
{
    SetValue(string value);
}

我有多个类在不了解它们的情况下实现IMyInterface在我需要设置值的代码段中。

是否可以在不使用属性名称的情况下初始化"值"属性?(有没有一种"好"的方法可以做到这一点?- 无法使用SetValue< TType >

void SetValue(object obj, string value)
{
    // object obj implements IMyInterface<???>
    PropertyInfo valueInfo = typeof(obj).GetType().GetProperty("Value")
    valueInfo.SetValue(obj, Activator.CreateInstance(valueInfo.PropertyType))
    ((IMyInterface)obj).SetValue(value);
}

提前谢谢。

编辑: - 删除 -

编辑2:

给出此结构:

public Interface IGeneric<TType> : INonGeneric
{
    TType Value2 {get;}
}
public Interface INonGeneric
{
    object Value1 {get;}
}

从反射中使用"Value1"非常简单:

INonGeneric myObject = (INonGeneric)givenObject;
doSomething(myObject.Value1)

如果我需要访问"Value2",那就不那么容易了。正如在我的第一个示例中所看到的,我不得不使用以下结构,这似乎不是访问"Value2"的最佳方式,因为属性名称是硬编码的。

PropertyInfo valueInfo = givenObject.GetType().GetProperty("Value2");
object value = (object)valueInfo.GetValue(givenObject);

有没有更好的解决方案?

初始化泛型类型的属性

如果我没猜错,你有实现 IGeneric 的实例,并且你想访问属性 Value2(具有泛型返回类型)。

问题是,泛型是为了编译时类型安全。如果您不知道类型参数>则无法将对象强制转换为 IGeneric<...。那么,如果您不知道类型参数,为什么要使用泛型呢?

这个"问题"有一个解决方案,它与 IEnumerable 和 IEnumerable 使用相同。 它看起来像这样:

public interface INonGeneric
{
    object Value {get; }
}
public interface IGeneric<T>
{
    T Value { get; }
}
public class Magic : INonGeneric, IGeneric<string>
{
    object INonGeneric.Value { get { return this.Value; } }
    public string Value { get { return "test"; } }
}

如果不使用类型参数,现在可以使用 Object 强制转换为 INonGeneric ;如果在编译时知道 type 参数,则可以使用 Generic 实现。

但是,如果您想在不知道类型参数的情况下访问泛型类型的属性(您无法控制),您将无法绕过反射或动态。

动态解决方案可能如下所示:

dynamic generic = givenObject;
object value2 = generic.Value2;