我已经编写了一些 VSTO (2003) 代码,这些代码根据邮件项目的附件成功地应用了一些强制性主题行更改。该代码是为在 microsoft.office.interop.outlook.mailitem 上操作而编写的但是,我需要相同的代码来操作其他类型,例如 microsoft.office.interop.outlook.appointmentitem(实际上它需要为任何用户可以发送具有主题的内容)。
假设 Outlook 项目类型具有主题属性、附件属性和保存方法,我该如何编写适用于所有相关 interop.outlook 类型的代码。
我尝试通过反射解决这个问题,但 GetProperty 正在返回 null 所以我不能在它上面使用 GetValue
? mi.GetType().GetProperty("主题")
空值
?(mi as Microsoft.Office.Interop.Outlook.MailItem).主题
“考试科目”
似乎没有我可以投射到的通用 Outlookitem 类来执行此操作。正确的做法是什么?
编辑:为了澄清我的代码是这样开始的......
void Application_ItemSend(object Item, ref bool Cancel)
{
如果(项目是 Microsoft.Office.Interop.Outlook.MailItem)
{
Microsoft.Office.Interop.Outlook.MailItem currentItem =
项目为 Microsoft.Office.Interop.Outlook.MailItem;
然后对 currentItem 执行操作(包括传递给当前使用 Microosft.Office.Interop.Outlook.MailItem 属性键入的各种函数。我希望它们处理“Microsoft.Interop.Outlook.somethingsendable”
是否有可能通过反射获得完整的“路径”?
示例假设我有以下类/属性。
public class Member
{
public string Name;
public Address Address;
}
public class Address
{
public string Line1;
public string Line2;
public string Line3;
}
Run Code Online (Sandbox Code Playgroud)
想象一下,我有一个名为m. 是否可以通过反射获得完整路径为“Member.Address.Line1”(作为字符串),只是通过某种方式传递m.Address.Line1?
我需要将以下 Java 概念移植到 C++ 中:
持有对象 id 键和类类型值的哈希映射:
Map<String, Class> _objectsBank = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
在 init 方法的某个地方,我像这样填充银行:
_objectsBank .put("CLASS_ID_1", MyClass1.class);
_objectsBank .put("CLASS_ID_2", MyClass2.class);
....
Run Code Online (Sandbox Code Playgroud)
然后,稍后,我根据需要构造了保存在该银行中的类之一的实例。一种“懒惰”的初始化:
private MyClass initNewProg(String name) {
MyClass instance;
try {
Class cl = _objectsBank.get(name);
java.lang.reflect.Constructor co = cl.getConstructor(String.class);
instance= (MyClass) co.newInstance(name);
return instance;
} catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e)
{
e.printStackTrace();
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我将如何在 C++ 中做到这一点?如何将类类型设置为 std::map 值,以便稍后查询以从中构造适当的实例?Boost 库中有这样的东西吗?
假设有一个类:
class A {
int a;
}
Run Code Online (Sandbox Code Playgroud)
然后有一个 A 类的孩子:
class B extends A {
int b;
}
Run Code Online (Sandbox Code Playgroud)
如果我打电话,B.class.getDeclaredFields()我只会得到“b”字段。
现在我怎样才能在这种情况下获得父类的字段“a”。
我已经以传统方式在 Java 中编写了反射代码,我知道如何对多边形进行反射。
我的问题是关于尝试新的东西,我在想如果我将多边形旋转 180 度,它会产生多边形的反射吗??我认为它会产生它的反射,但它在数学上是可以接受的吗??
我正在尝试使用反射在运行时获取类的构造函数参数的类型。下面的方法在抽象超类中。然而this.type,行为并不如预期。任何帮助将非常感激。
/**
* Maps constructor field names to types
*
* @return Map[String, Type]
*/
def getParamTypes: Map[String, ru.Type] =
ru.typeOf[this.type].
member(ru.termNames.CONSTRUCTOR)
.asMethod.paramLists(0).
foldRight(Map(): Map[String, ru.Type])((p, a) => {
a + (p.name.decodedName.toString -> p.typeSignature)
})
Run Code Online (Sandbox Code Playgroud) 我遇到了一个叫做反射的术语。它是工厂设计模式中常用的一个特性。我很难理解这个概念,因为我还在学习如何编程。如何在 C# 或 Java 的工厂设计模式中使用反射?谁能给我一个简单的例子,并向我展示你使用反射来实现工厂设计模式的代码?
微软提供了这个反射的代码示例,但我不知道如何在工厂设计模式中使用它。
// Using GetType to obtain type information:
int i = 42;
System.Type type = i.GetType();
System.Console.WriteLine(type);
The Output is: System.Int32
Run Code Online (Sandbox Code Playgroud) 我有以下代码,它加载了我的项目引用的所有组件以及它们使用的所有引用
var types = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes())
.Where(t => t.IsClass && !t.IsAbstract && (typeof (MyType).IsAssignableFrom(t)));
foreach (var type in types.Where(type => typeof (MyType).IsAssignableFrom(type)))
{... do something ...}
Run Code Online (Sandbox Code Playgroud)
在我的开发箱上这按预期工作,在其他环境中这会导致异常
System.Reflection.ReflectionTypeLoadException:无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。
为什么会抛出异常?是否可以重构我的代码以使其忽略异常?
我有一个ApiService像这样命名的 Kotlin 单身人士:
object ApiService {
private val someApi:SomeApi = SomeApi.create()
fun getSomeApi():SomeApi{
return someApi
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想ApiService.getSomeApi动态调用。我做了这样的事情:
val fullClassName = "com.somepackage.ApiService"
val obj = Class.forName(fullClassName)
obj.getMethod("getSomeApi").invoke(obj)
Run Code Online (Sandbox Code Playgroud)
但我得到了一个错误,如:
Expected receiver of type com.somepackage.ApiService, but got java.lang.Class <com.somepackage.ApiService>
Run Code Online (Sandbox Code Playgroud)
如果我硬编码.invoke(ApiService)它会正常工作,但是有没有办法动态地做到这一点?
我正在尝试举一个用户和银行程序的简单示例,在该示例中,您必须保证钱不能被可以添加,继承,实现当前现有类但不能编辑初始类的人所欺骗。因此,我问您是否可以在没有提供的转账功能的情况下设置某人的帐户余额。
我尝试使用反射,但是您必须具有公共构造函数才能创建一个对象,在该对象上调用私有方法,但是由于所有内容都是私有的,因此无法对其进行调用。
public class Bank {
private static Bank ourInstance = new Bank();
public static Bank getInstance() {
return ourInstance;
}
private Bank() {}
public boolean requestTransfer(User user1, User user2, double amount) {
BankAccount ba1 = (BankAccount) user1.getBankAccount();
BankAccount ba2 = (BankAccount) user2.getBankAccount();
if (!(hasAccount(ba1) && hasAccount(ba2)))
return false;
if (ba1.getBalance() >= amount)
{
ba1.setBalance(ba1.getBalance() - amount);
ba2.setBalance(ba2.getBalance() + amount);
return true;
}
return false;
}
private class BankAccount implements BankAccountInterface {
private double balance;
private User user;
private BankAccount(double …Run Code Online (Sandbox Code Playgroud) reflection ×10
java ×5
c# ×4
appdomain ×1
c++ ×1
field ×1
graphics ×1
kotlin ×1
polymorphism ×1
rotation ×1
scala ×1
stl ×1
unit-testing ×1
vsto ×1