初始化泛型属性
Initialize Property of Generic Type
我已经阅读了多个 post,但没有找到适合我的问题的答案。
但必须有一个。所以如果这个 post 真的是重复的,请耐心等待。
我尝试初始化实现泛型接口的泛型类型的属性。
我的界面基本上是这样的:
public interface IMyInterface<TType> : IMyInterface
{
TType Value {get; set;}
// ... and some more ...
}
public interface IMyInterface
{
SetValue(string value);
}
我有多个类在不知情的情况下实施 IMyInterface
在这段代码中,我需要设置值。
是否可以在不使用属性名称的情况下初始化 "Value"-属性?
(是否有 "nice" 方法来做到这一点?) - 无法使用 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(它有一个通用的 return 类型)。
事实是,泛型是为了编译时类型安全。如果您不知道类型参数,则不能将对象强制转换为 IGeneric<...> 。那么,如果您不知道类型参数,为什么还要使用泛型呢?
这个"problem"有一个解决方案,它与 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"; } }
}
如果您不使用类型参数,您现在可以将对象强制转换为 INonGeneric,或者如果您在编译时知道类型参数,则可以使用通用实现。
但是,如果您想在不知道类型参数的情况下访问泛型类型的 属性(您无法控制),您将无法绕过反射或动态。
动态解决方案如下所示:
dynamic generic = givenObject;
object value2 = generic.Value2;
我已经阅读了多个 post,但没有找到适合我的问题的答案。 但必须有一个。所以如果这个 post 真的是重复的,请耐心等待。
我尝试初始化实现泛型接口的泛型类型的属性。
我的界面基本上是这样的:
public interface IMyInterface<TType> : IMyInterface
{
TType Value {get; set;}
// ... and some more ...
}
public interface IMyInterface
{
SetValue(string value);
}
我有多个类在不知情的情况下实施 IMyInterface
在这段代码中,我需要设置值。
是否可以在不使用属性名称的情况下初始化 "Value"-属性?
(是否有 "nice" 方法来做到这一点?) - 无法使用 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(它有一个通用的 return 类型)。
事实是,泛型是为了编译时类型安全。如果您不知道类型参数,则不能将对象强制转换为 IGeneric<...> 。那么,如果您不知道类型参数,为什么还要使用泛型呢?
这个"problem"有一个解决方案,它与 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"; } }
}
如果您不使用类型参数,您现在可以将对象强制转换为 INonGeneric,或者如果您在编译时知道类型参数,则可以使用通用实现。
但是,如果您想在不知道类型参数的情况下访问泛型类型的 属性(您无法控制),您将无法绕过反射或动态。
动态解决方案如下所示:
dynamic generic = givenObject;
object value2 = generic.Value2;